web-dev-qa-db-de.com

Wörterbuch Iteration - für dict vs für dict.items ()

Wenn wir das unten stehende Wörterbuch durchlaufen, wird bei jeder Wiederholung ein Schlüssel-Wert-Paar (richtig) zurückgegeben 

for key, value in dict.items():
    print "%s key has the value %s" % (key, value)

'some key' key hat den Wert 'some value' (wird wiederholt, jedoch oft ein k, v Paar)

Das oben genannte ist für mich jedoch sinnvoll, wenn wir dies tun:

for key in dict.items():
    print "%s key has the value %s" % (key, value)

("some key", "some value") hat den Wert "some value" (der linke Tupel durchläuft jedes Schlüsselwertpaar und der rechte Wert bleibt einfach beim ersten Wert im Diktat und wiederholen sich.)

Wir erhalten am Ende jedes k, v-Paar, das im ersten %s (Schlüssel) zurückgegeben wird, und der 2. %s (Wert) iteriert nicht, es gibt nur den ersten Wert im Dikt für jede Iteration der for-Schleife zurück.

Ich verstehe, dass, wenn Sie nur mit for key in dict iterieren, Sie nur über die Tasten iterieren. Da hier eine Menge von Tupeln (mit dict.items()) nur mit dem Schlüssel in der for-Schleife durchlaufen wird, sollte die Schleife dieselbe Anzahl von Malen wie im ersten Beispiel ausgeführt werden, da es so viele Schlüssel wie Schlüsselwertpaare gibt.

Was ich nicht verstehen kann, ist, warum Python Ihnen das gesamte Tuple im zweiten Beispiel für key gibt.


Danke für die Hilfe, ich möchte dem Mix noch eine Frage hinzufügen.

for a,a in dict.items():
    print a

Warum druckt der Wert oben und wenn i print a,a - beide Werte werden offensichtlich zweimal gedruckt. Wenn ich for a,b eingegeben hätte, würde ich (key,value)-Paare iterieren, also würde ich logischerweise denken, ich würde jetzt (key,key)-Paare durchlaufen und würde daher eher Schlüssel als Wert ausgeben. Tut mir leid für die grundlegenden Fragen, die nur im Dolmetscher herumgespielt werden und versucht werden, etwas herauszufinden.

15
Solaxun

Das erste Beispiel verwendet etwas, das als "Tuple-Auspacken" bekannt ist, um das WIRKLICH gleiche Tuple wie in Ihrem separaten Beispiel in zwei verschiedene Variablen aufzuteilen.

Mit anderen Worten:

for key, value in dict.items():

Ist nur das:

for keyvalue in dict.items():
    key, value = keyvalue[0], keyvalue[1]

Denken Sie daran, dass eine for-Schleife immer die einzelnen Elemente des Iterators durchläuft, den Sie ihr geben. dict.items() gibt ein listeähnliches Objekt aus Tupeln zurück, sodass jeder Lauf durch die for-Schleife ein neuer Tuple ist, der automatisch in key, value entpackt wird, wenn Sie ihn in der for-Schleife als solche definieren.

Es kann hilfreich sein, es so zu sehen:

d = {'a':1, 'b':2, 'c':3}
list(d)          # ['a', 'b', 'c']             the keys
list(d.keys())   # ['a', 'b', 'c']             the keys
list(d.values()) # [1, 2, 3]                   the values
list(d.items())  # [('a',1), ('b',2), ('c',3)] a Tuple of (key, value)

N.B. dass der einzige Grund für Ihren Code

for key in dict.items():
    print "%s key has value: %s" % (key, value)

Wirft keine NameError, weil value bereits an anderer Stelle in Ihrem Code definiert ist. Da Sie value nirgends in dieser for-Schleife definieren, wird sonst eine Ausnahme ausgelöst.

25
Adam Smith

In dem zweiten Beispiel, das Sie angegeben haben, weisen Sie keinem Wert "Wert" zu:

Beachten Sie die kleine Bearbeitung hier:

for key in dict:  ##Removed call to items() because we just want the key, 
                  ##Not the key, value pair
    value = dict[key]  # Added this line
    print "%s key has the value %s (key, value)

Hinweis:

Im zweiten Beispiel könnten Sie jetzt dict.keys () oder dict aufrufen (durch das Referenzieren eines Wörterbuchs in einer for-Schleife werden dessen Schlüssel zurückgegeben). Beim Aufruf von dict.items () wird verwirrend Key = (,) Zugewiesen, was wahrscheinlich nicht das ist, was Sie wollen.

0
ErlVolton