Der folgende Code verwirrt mich ein wenig:
d = {'x': 1, 'y': 2, 'z': 3}
for key in d:
print key, 'corresponds to', d[key]
Was ich nicht verstehe, ist die key
Portion. Woran erkennt Python, dass nur der Schlüssel aus dem Wörterbuch gelesen werden muss? Ist key
ein spezielles Wort in Python? Oder ist es einfach eine Variable?
python
python-2.7
dictionary
Spitzenkoch
quelle
quelle
Antworten:
key
ist nur ein Variablenname.wird einfach die Schlüssel im Wörterbuch durchlaufen und nicht die Schlüssel und Werte. Um sowohl den Schlüssel als auch den Wert zu durchlaufen, können Sie Folgendes verwenden:
Für Python 3.x:
Für Python 2.x:
Ändern Sie das Wort
key
in, um es selbst zu testenpoop
.In Python 3.x
iteritems()
wurde durch simply ersetztitems()
, was eine satzartige Ansicht zurückgibt, die vom Diktat unterstützt wird, wie,iteritems()
aber noch besser. Dies ist auch in 2.7 als verfügbarviewitems()
.Die Operation
items()
funktioniert sowohl für 2 als auch für 3, aber in 2 wird eine Liste der Wörterbuchpaare zurückgegeben(key, value)
, die keine Änderungen am Diktat widerspiegelt, die nach demitems()
Aufruf auftreten. Wenn Sie das 2.x-Verhalten in 3.x möchten, können Sie anrufenlist(d.items())
.quelle
sorted
zur Stabilisierung erforderlich sind.Keys and values are iterated over in insertion order.
[ docs.python.org/3/library/…Es ist nicht so, dass der Schlüssel ein spezielles Wort ist, sondern dass Wörterbücher das Iteratorprotokoll implementieren. Sie können dies in Ihrer Klasse tun. In dieser Frage erfahren Sie beispielsweise, wie Sie Klasseniteratoren erstellen.
Bei Wörterbüchern wird es auf C-Ebene implementiert. Die Details sind in PEP 234 verfügbar . Insbesondere der Abschnitt mit dem Titel "Dictionary Iterators":
In Python 3
dict.iterkeys()
,dict.itervalues()
unddict.iteritems()
werden nicht mehr unterstützt. Verwendungdict.keys()
,dict.values()
unddict.items()
stattdessen.quelle
Das Iterieren über einen
dict
Iter durchläuft seine Schlüssel in keiner bestimmten Reihenfolge, wie Sie hier sehen können:Bearbeiten: (Dies ist in Python3.6 nicht mehr der Fall , aber beachten Sie, dass das Verhalten noch nicht garantiert ist. )
Für Ihr Beispiel ist es besser, Folgendes zu verwenden
dict.items()
:Dies gibt Ihnen eine Liste von Tupeln. Wenn Sie eine Schleife über sie wie diese, ist jedes Tupel entpackt in
k
undv
automatisch:Die Verwendung von
k
undv
als Variablennamen beim Durchlaufen von adict
ist durchaus üblich, wenn der Hauptteil der Schleife nur wenige Zeilen umfasst. Für kompliziertere Schleifen kann es eine gute Idee sein, aussagekräftigere Namen zu verwenden:Es ist eine gute Idee, sich daran zu gewöhnen, Formatzeichenfolgen zu verwenden:
quelle
key
ist einfach eine Variable.Für Python2.X :
... oder besser,
Für Python3.X :
quelle
Wenn Sie Wörterbücher mit der
for .. in ..
-syntax durchlaufen, werden immer die Schlüssel durchlaufen (auf die Werte kann mit zugegriffen werdendictionary[key]
).Um über Schlüssel-Wert-Paare zu iterieren, verwenden Sie in Python 2
for k,v in s.iteritems()
und in Python 3for k,v in s.items()
.quelle
items()
anstelle voniteritems()
Dies ist eine sehr verbreitete Schleifensprache.
in
ist ein Operator. Wannfor key in dict
und wann es verwendet werden muss, findenfor key in dict.keys()
Sie in David Goodgers Idiomatic Python-Artikel (archivierte Kopie) .quelle
in
, überprüfen Sie den Operatorteil auf Existenz . Vielleicht ist es besser, diesein is an operator
Informationen zu löschen .Es sind nicht nur
for
Schleifen. Das wichtige Wort hier ist "iterieren".Ein Wörterbuch ist eine Zuordnung von Schlüsseln zu Werten:
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:
Es passiert, wenn wir das Wörterbuch an list (oder ein anderes Objekt vom Typ Collection) übergeben:
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:Wir sollten diese speziellen Methoden nicht selbst verwenden, sondern die entsprechende integrierte Funktion verwenden, um sie aufzurufen
iter
:Iteratoren haben eine
__next__
Methode - aber wir nennen sie mit der eingebauten Funktionnext
:Wenn ein Iterator erschöpft ist, wird er ausgelöst
StopIteration
. Auf diese Weise kann Python einefor
Schleife, ein Listenverständnis, einen Generatorausdruck oder einen anderen iterativen Kontext verlassen. Sobald ein Iterator ausgelöst wirdStopIteration
, wird er immer ausgelöst. Wenn Sie erneut iterieren möchten, benötigen Sie einen neuen.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:
Wenn wir den Variablennamen ändern, erhalten wir immer noch die Schlüssel. Lass es uns versuchen:
Wenn wir über die Werte iterieren möchten, müssen wir die
.values
Methode der Diktate oder für beide zusammen verwenden.items
:In dem angegebenen Beispiel wäre es effizienter, die folgenden Elemente zu durchlaufen:
Aber für akademische Zwecke ist das Beispiel der Frage in Ordnung.
quelle
Ich habe einen Anwendungsfall, in dem ich das Diktat durchlaufen muss, um das Schlüssel-Wert-Paar sowie den Index zu erhalten, der angibt, wo ich mich befinde. So mache ich es:
Beachten Sie, dass die Klammern um den Schlüssel wichtig sind. Ohne die Klammern erhalten Sie einen ValueError "Nicht genügend Werte zum Entpacken".
quelle
Sie können die Implementierung von CPython
dicttype
auf GitHub überprüfen . Dies ist die Signatur der Methode, die den Diktator implementiert:CPython dictobject.c
quelle
Um über Schlüssel zu iterieren, ist es langsamer, aber besser zu verwenden
my_dict.keys()
. Wenn Sie versucht haben, so etwas zu tun:Dies würde einen Laufzeitfehler verursachen, da Sie die Schlüssel ändern, während das Programm ausgeführt wird. Wenn Sie unbedingt Zeit sparen möchten, verwenden Sie den
for key in my_dict
Weg, aber Sie wurden gewarnt;).quelle
Dadurch wird die Ausgabe in aufsteigender Reihenfolge nach Werten sortiert gedruckt.
Ausgabe:
quelle