Iterieren über Wörterbücher mit 'for'-Schleifen
d = {'x': 1, 'y': 2, 'z': 3}
for key in d:
...
Woran erkennt Python, dass nur der Schlüssel aus dem Wörterbuch gelesen werden muss? Ist Schlüssel ein spezielles Wort in Python? Oder ist es einfach eine Variable?
Es sind nicht nur for
Schleifen. Das wichtige Wort hier ist "iterieren".
Ein Wörterbuch ist eine Zuordnung von Schlüsseln zu Werten:
d = {'x': 1, 'y': 2, 'z': 3}
Jedes Mal, wenn wir darüber iterieren, iterieren wir über die Schlüssel. Der Variablenname key
soll nur beschreibend sein - und er ist für diesen Zweck durchaus geeignet.
Dies geschieht in einem Listenverständnis:
>>> [k for k in d]
['x', 'y', 'z']
Es passiert, wenn wir das Wörterbuch an list (oder ein anderes Objekt vom Typ Collection) übergeben:
>>> list(d)
['x', 'y', 'z']
Python iteriert in einem Kontext, in dem es erforderlich ist, die __iter__
Methode des Objekts (in diesem Fall das Wörterbuch), das einen Iterator (in diesem Fall ein Keyiterator-Objekt) zurückgibt:
>>> d.__iter__()
<dict_keyiterator object at 0x7fb1747bee08>
Wir sollten diese speziellen Methoden nicht selbst verwenden, sondern die entsprechende integrierte Funktion verwenden, um sie aufzurufen iter
:
>>> key_iterator = iter(d)
>>> key_iterator
<dict_keyiterator object at 0x7fb172fa9188>
Iteratoren haben eine __next__
Methode - aber wir nennen sie mit der eingebauten Funktion next
:
>>> next(key_iterator)
'x'
>>> next(key_iterator)
'y'
>>> next(key_iterator)
'z'
>>> next(key_iterator)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
Wenn ein Iterator erschöpft ist, wird er ausgelöst StopIteration
. Auf diese Weise kann Python eine for
Schleife, ein Listenverständnis, einen Generatorausdruck oder einen anderen iterativen Kontext verlassen. Sobald ein Iterator ausgelöst wird StopIteration
, wird er immer ausgelöst. Wenn Sie erneut iterieren möchten, benötigen Sie einen neuen.
>>> list(key_iterator)
[]
>>> new_key_iterator = iter(d)
>>> list(new_key_iterator)
['x', 'y', 'z']
Zurück zu den Diktaten
Wir haben gesehen, wie Diktate in vielen Zusammenhängen iterierten. Was wir gesehen haben, ist, dass wir jedes Mal, wenn wir über ein Diktat iterieren, die Schlüssel erhalten. Zurück zum ursprünglichen Beispiel:
d = {'x': 1, 'y': 2, 'z': 3}
for key in d:
Wenn wir den Variablennamen ändern, erhalten wir immer noch die Schlüssel. Lass es uns versuchen:
>>> for each_key in d:
... print(each_key, '=>', d[each_key])
...
x => 1
y => 2
z => 3
Wenn wir über die Werte iterieren möchten, müssen wir die .values
Methode der Diktate oder für beide zusammen verwenden .items
:
>>> list(d.values())
[1, 2, 3]
>>> list(d.items())
[('x', 1), ('y', 2), ('z', 3)]
In dem angegebenen Beispiel wäre es effizienter, die folgenden Elemente zu durchlaufen:
for a_key, corresponding_value in d.items():
print(a_key, corresponding_value)
Aber für akademische Zwecke ist das Beispiel der Frage in Ordnung.