Frage Iterieren über Wörterbücher mit "for" -Schleifen


Ich bin etwas verwirrt über den folgenden Code:

d = {'x': 1, 'y': 2, 'z': 3} 
for key in d:
    print key, 'corresponds to', d[key]

Was ich nicht verstehe, ist der key Portion. Wie erkennt Python, dass es nur den Schlüssel aus dem Wörterbuch lesen muss? Ist key ein spezielles Wort in Python? Oder ist es einfach eine Variable?


2105
2017-07-20 22:27


Ursprung


Antworten:


key ist nur ein Variablenname.

for key in d:

wird einfach die Schlüssel im Wörterbuch durchlaufen, anstatt die Schlüssel und Werte. Um sowohl den Schlüssel als auch den Wert zu durchlaufen, können Sie Folgendes verwenden:

Für Python 2.x:

for key, value in d.iteritems():

Für Python 3.x:

for key, value in d.items():

Um es selbst zu testen, ändern Sie das Wort key zu poop.

Für Python 3.x, iteritems() wurde einfach ersetzt items(), die eine menüähnliche Ansicht zurückgibt, die vom Diktat unterstützt wird, wie iteritems() aber noch besser. Dies ist auch in 2.7 als verfügbar viewitems().

Die Operation items() funktioniert für 2 und 3, aber in 2 wird eine Liste der Wörterbücher zurückgegeben (key, value) Paare, die Änderungen am Diktat nicht widerspiegeln, die nach dem items() Anruf. Wenn Sie das 2.x-Verhalten in 3.x möchten, können Sie anrufen list(d.items()).


3784
2017-07-20 22:29



Es ist nicht so, dass der Schlüssel ein spezielles Wort ist, aber Wörterbücher implementieren das Iterator-Protokoll. Sie könnten dies in Ihrer Klasse tun, z. sehen diese Frage wie man Klasseniteratoren erstellt.

Im Fall von Wörterbüchern ist es auf der C-Ebene implementiert. Die Details sind verfügbar in PEP 234. Insbesondere der Abschnitt "Wörterbuch-Iteratoren":

  • Wörterbücher implementieren einen tp_iter-Slot, der einen effizienten zurückgegeben wird   Iterator, der über die Schlüssel des Wörterbuchs iteriert. [...] Dies   bedeutet, dass wir schreiben können

    for k in dict: ...
    

    was äquivalent ist, aber viel schneller als

    for k in dict.keys(): ...
    

    solange die Beschränkung für Änderungen am Wörterbuch   (entweder durch die Schleife oder durch einen anderen Thread) werden nicht verletzt.

  • Fügen Sie Methoden zu Wörterbüchern hinzu, die verschiedene Arten von Wörtern zurückgeben   Iteratoren explizit:

    for key in dict.iterkeys(): ...
    
    for value in dict.itervalues(): ...
    
    for key, value in dict.iteritems(): ...
    

    Das bedeutet, dass for x in dict ist Kurzschrift für for x in dict.iterkeys().


325
2017-07-20 23:52



Iteriert über eine dict iteriert durch seine Schlüssel in keiner bestimmten Reihenfolge, wie Sie hier sehen können:

Bearbeiten: (Das ist nicht mehr der Fall in Python3.6aber beachte, dass es ist nicht garantiert Verhalten noch)

>>> d = {'x': 1, 'y': 2, 'z': 3} 
>>> list(d)
['y', 'x', 'z']
>>> d.keys()
['y', 'x', 'z']

Für Ihr Beispiel ist es eine bessere Idee zu verwenden dict.items():

>>> d.items()
[('y', 2), ('x', 1), ('z', 3)]

Dies gibt Ihnen eine Liste von Tupeln. Wenn Sie so über sie hinwegschleifen, wird jedes Tupel entpackt k und v automatisch:

for k,v in d.items():
    print(k, 'corresponds to', v)

Verwenden k und v als Variablennamen beim Durchlaufen von a dict ist ziemlich üblich, wenn der Körper der Schleife nur ein paar Zeilen ist. Für kompliziertere Schleifen kann es sinnvoll sein, aussagekräftigere Namen zu verwenden:

for letter, number in d.items():
    print(letter, 'corresponds to', number)

Es ist eine gute Idee, sich an die Formatzeichenfolge zu gewöhnen:

for letter, number in d.items():
    print('{0} corresponds to {1}'.format(letter, number))

151
2017-07-21 01:27



key ist einfach eine Variable.

Zum Python2.X:

d = {'x': 1, 'y': 2, 'z': 3} 
for my_var in d:
    print my_var, 'corresponds to', d[my_var]

... oder besser,

d = {'x': 1, 'y': 2, 'z': 3} 
for the_key, the_value in d.iteritems():
    print the_key, 'corresponds to', the_value

Zum Python3.X:

d = {'x': 1, 'y': 2, 'z': 3} 
for the_key, the_value in d.items():
    print(the_key, 'corresponds to', the_value)

42
2017-07-20 23:49



Wenn Sie Wörterbücher mit Hilfe von for .. in ..-Syntax, es iteriert immer über die Schlüssel (auf die Werte kann mit zugegriffen werden) dictionary[key]).

Um über Schlüssel / Wert-Paare zu iterieren, verwenden Sie for k,v in s.iteritems().


39
2017-07-20 22:29



Dies ist ein sehr häufiges Looping-Idiom. in ist ein Operator. Für wann zu verwenden for key in dict und wenn es sein muss for key in dict.keys() sehen David Goodgers Idiomatischer Python-Artikel.


20
2017-07-20 22:42



Sie können dies verwenden:

for key,val in d.items():
    print key, 'is the key for ', val

9
2018-01-14 14:42