2008-10-06 9 views
18

Ich habe eine Liste String-Tag.Python-Wörterbuch-Update-Methode

Ich versuche, ein Wörterbuch mit dem Schlüssel als Tag-String und Werte als Array-Index zu initialisieren.

for i, ithTag in enumerate(tag): 
    tagDict.update(ithTag=i) 

Die oben genannten Erträge mich { 'ithTag': 608} 608 ist der 608. Index

Mein Problem ist, dass, während die i als Variable interpretiert wird, Python die "ithTag" behandelt als String anstelle einer Variablen.

Ich bin verwirrt, es ist irgendwie schwer zu google diese Art von spezifischen Fragen. Ich hoffe, ich habe den Titel dieser Frage richtig formuliert,

Danke!

+0

Das ist eine fast aufreibbare Frage. Ich denke, nur die gewählte Antwort ist schlimmer als [diese] (http://stackoverflow.com/a/179005/131120). Denken Sie daran, die Gründe für die Wahl der For-Loop-Antwort zu ändern oder zu erklären? – erikbwork

+0

Ich wählte diesen, weil Jerub zuerst antwortete; und ich habe es sofort markiert. Auch aus einem C#/Java-Hintergrund kommt Jerubs Antwort mir bekannter vor und ich mochte seine Erklärung, warum .update() nicht für mich funktionierte. – freshWoWer

Antwort

46

Sie eigentlich wollen, dies zu tun:

for i, tag in enumerate(tag): 
    tagDict[tag] = i 

Die .update() -Methode verwendet, um ein Wörterbuch für die Aktualisierung eines anderes Wörterbuch verwenden, nicht für ein einzelnes Schlüssel/Wert-Paar zu ändern.

2

Ich denke, das ist das, was Sie tun möchten:

d = {} 
for i, tag in enumerate(ithTag): 
    d[tag] = i 
2

Versuchen

tagDict[ithTag] = i 
17

Wenn Sie klug sein wollen:

tagDict.update(map(reversed, enumerate(tag))) 

Dank Brian für das Update. Dies ist anscheinend ~ 5% schneller als die iterative Version.

(EDIT: Danke saverio für den Hinweis auf meine Antwort falsch war (jetzt fest) Wahrscheinlich die effizienteste/Pythonic Weg Torsten Marek Antwort wäre, leicht modifiziert.

tagDict.update((t, i) for (i,t) in enumerate(tag)) 

)

+0

Tatsächlich kann update() eine Sequenz direkt übernehmen, so dass kein intermediäres Diktat erstellt werden muss. DoingDict.update (enumerate (tag)) ist tatsächlich etwas (~ 5%) schneller als die iterative Version. – Brian

+2

Die Schlüssel von 'tagDict' müssen die Elemente von' tag' sein. Verwenden Sie 'tagDict.update (map (reversed, enumerate (tag)))', in der Tat das funktionale Äquivalent von Torsten Mareks Antwort. – rewritten

+0

@Claudiu, weil, wie schon Saverio erwähnt, 'tagDict.update (enumerate (tag))' macht Indizes als dict Schlüssel, während sie Werte sein müssen – warvariuc

12

Es ist ein Einzeiler:

tagDict = dict((t, i) for i, t in enumerate(tag)) 
+0

Ich denke, das sollte die akzeptierte Antwort sein - es ist klarer, was hier vor sich geht, keine Nebenwirkungen zu befürchten. –

2

ich denke, was Sie wollen, ist dies:

for i, ithTag in enumerate(tag): 
    tagDict.update({ithTag: i})