[Python] Iterieren über Wörterbücher mit "for" -Schleifen


Answers

Es ist nicht so, dass der Schlüssel ein spezielles Wort ist, sondern dass Wörterbücher das Iterator-Protokoll implementieren. Sie könnten dies in Ihrer Klasse tun. Sehen Sie sich beispielsweise diese Frage an, um Klassen-Iteratoren zu erstellen.

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

  • Wörterbücher implementieren einen tp_iter-Slot, der einen effizienten Iterator zurückgibt, 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 von Änderungen am Wörterbuch (entweder durch die Schleife oder durch einen anderen Thread) nicht verletzt wird.

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

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

    Dies bedeutet, dass for x in dict eine Abkürzung for x in dict.iterkeys() .

Question

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 . Wie erkennt Python, dass es nur den Schlüssel aus dem Wörterbuch lesen muss? Ist ein key in Python ein key ? Oder ist es einfach eine Variable?




Ich habe einen Anwendungsfall, in dem ich durch das Diktat iterieren muss, um den Schlüssel, das Wertpaar und auch den Index zu erhalten, der angibt, wo ich bin. So mache ich es:

d = {'x': 1, 'y': 2, 'z': 3} 
for i, (key, value) in enumerate(d.items()):
   print(i, key, value)

Beachten Sie, dass die Klammern um den Wert key, value wichtig sind. Ohne die Klammern erhalten Sie einen ValueError "Nicht genügend Werte zum Entpacken".




Sie können die Implementierung von cpython dicttype auf GitHub überprüfen. Dies ist die Signatur der Methode, die den dict-Iterator implementiert:

_PyDict_Next(PyObject *op, Py_ssize_t *ppos, PyObject **pkey,
         PyObject **pvalue, Py_hash_t *phash)

cpython dictobject.c




Python 2

Diktaturen sind für Python so wichtig, dass sie auch sehr einfach zu benutzen sind. Um durch jede Taste eines Wörterbuchs zu iterieren, verwenden Sie einfach "for k in d" oder "for key in d" oder eine beliebige Variable anstelle von k oder key wie in meinen Beispielen. Das liegt daran, dass Sie die Schlüssel des Wörterbuchs standardmäßig so iterieren können. Um auf die Werte der Schlüssel zuzugreifen, die Sie uns einfach d [k] oder d [Schlüssel] oder d [Name der Variablen] zugewiesen haben, hängt von der Variablen ab, die Sie in der Schleife zur Iteration der Schlüssel verwendet haben.

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

Python 3.6

Sie können auch so etwas tun:

d = {'x': 1, 'y': 2, 'z': 3} 
for k,v in d.items():
    print(k,":",v)

Ausgabe

x : 1
y : 2
z : 3



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

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