enumerate () für Wörterbuch in Python

82

Ich weiß, dass wir enumeratezum Iterieren einer Liste verwenden, aber ich habe es in einem Wörterbuch versucht und es gab keinen Fehler.

CODE:

enumm = {0: 1, 1: 2, 2: 3, 4: 4, 5: 5, 6: 6, 7: 7}

for i, j in enumerate(enumm):
    print(i, j)

AUSGABE:

0 0

1 1

2 2

3 4

4 5

5 6

6 7

Kann jemand die Ausgabe erklären?

Aditya Krishn
quelle
2
for i, j in enumerate(enumm) wird ibei jeder Iteration inkrementiert und jfängt das übliche Element aus dem enumerateFunktionsargument ab, das in diesem Fall ein Wörterbuch ist. Das Iterieren über Diktate ist im Wesentlichen das Iterieren über seine Schlüssel.
Divyanshu Srivastava

Antworten:

111

Zusätzlich zu den bereits bereitgestellten Antworten gibt es in Python ein sehr schönes Muster, mit dem Sie sowohl Schlüssel als auch Werte eines Wörterbuchs auflisten können.

Im Normalfall zählen Sie die Schlüssel des Wörterbuchs auf:

example_dict = {1:'a', 2:'b', 3:'c', 4:'d'}

for i, k in enumerate(example_dict):
    print(i, k)

Welche Ausgänge:

0 1
1 2
2 3
3 4

Wenn Sie jedoch sowohl Schlüssel als auch Werte aufzählen möchten, ist dies der folgende Weg:

for i, (k, v) in enumerate(example_dict.items()):
    print(i, k, v)

Welche Ausgänge:

0 1 a
1 2 b
2 3 c
3 4 d
João Almeida
quelle
1
(+1) Sie können auch einfach dictionary.items()(ohne Aufzählung) ein Ansichtsobjekt mit Schlüssel-Wert-Paaren als Liste von Tupeln abrufen.
Tiago Martins Peres 31
62

Die erste Ausgabespalte ist der Index jedes Elements in enummund die zweite ist der Schlüssel. Wenn Sie Ihr Wörterbuch iterieren möchten, verwenden Sie .items ():

for k, v in enumm.items():
    print(k, v)

Und die Ausgabe sollte folgendermaßen aussehen:

0 1
1 2
2 3
4 4 
5 5
6 6
7 7

quelle
31

Ich dachte nur, ich würde hinzufügen, wenn Sie den Index, den Schlüssel und die Werte eines Wörterbuchs aufzählen möchten, sollte Ihre for-Schleife folgendermaßen aussehen:

for index, (key, value) in enumerate(your_dict.items()):
    print(index, key, value)
Jordan Mackie
quelle
3
Diese Frage bezieht sich auf Probleme mit der Syntax, und diese Antwort lieferte die kürzeste Lösung von zwei hinzugefügten Klammern:idx, (k, v) in enumerate(d.items()):
Sean Pianka
Hallo Sean, ich bin mir nicht sicher, ob Sie der Antwort zustimmen oder einfach sagen, dass kürzere Variablennamen für eine bessere Antwort sorgen?
Jordan Mackie
25
dict1={'a':1, 'b':'banana'}

So listen Sie das Wörterbuch in Python 2.x auf:

for k,v in dict1.iteritems():
        print k,v 

Verwenden Sie in Python 3.x:

for k,v in dict1.items():
        print(k,v)
# a 1
# b banana

Wie andere bereits angedeutet haben, können Sie, wenn Sie einen laufenden Index wünschen, auch Folgendes haben:

for i  in enumerate(dict1.items()):
   print(i)  

 # (0, ('a', 1))
 # (1, ('b', 'banana'))

Dies macht jedoch den Zweck eines Wörterbuchs (Karte, assoziatives Array) zunichte , das eine effiziente Datenstruktur für die Suche im Telefonbuchstil darstellt. Die Reihenfolge der Wörterbücher kann mit der Implementierung verbunden sein und sollte nicht als verlässlich angesehen werden. Wenn Sie die Bestellung benötigen, verwenden Sie stattdessen OrderedDict .

Roadrunner66
quelle
2
Ich darf diesen Beitrag nicht mit 2 Zeichen bearbeiten, aber das OP hat dies als für Python 3 markiert, daher muss die print-Anweisung in Klammern um k, v stehen.
wp-overwatch.com
@Herr. Ich werde es reparieren.
Roadrunner66
19
Dies sollte beachtet werden, ist nur für Python2 verfügbar. dict.iteritems () wurde in python3 entfernt, siehe auch stackoverflow.com/questions/30418481/…
gyger
1
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
lkahtz
Ty. Aktualisiert python3 vs python2. Kommentar zur Aufzählung hinzugefügt.
roadrunner66
5

Da Sie enumeratedaher verwenden, ist Ihr itatsächlich der Index des Schlüssels und nicht der Schlüssel selbst.

Sie gelangen also 3in die erste Spalte der Zeile 3 4, obwohl kein Schlüssel vorhanden ist 3.

enumerate iteriert durch eine Datenstruktur (sei es eine Liste oder ein Wörterbuch) und gibt gleichzeitig die aktuelle Iterationsnummer an.

Daher sind die Spalten hier die Iterationsnummer, gefolgt vom Schlüssel im Wörterbuch enum

Andere Lösungen haben bereits gezeigt, wie man über Schlüssel- und Wertepaare iteriert, damit ich das in meinem nicht wiederhole.

Ankur Ranjan
quelle
4

enumerate()Wenn Sie an einer Liste arbeiten, erhalten Sie tatsächlich den Index und den Wert der Elemente in der Liste. Zum Beispiel:

l = [1, 2, 3, 4, 5, 6, 7, 8, 9]
for i, j in enumerate(list):
    print(i, j)

gibt

0 1
1 2
2 3
3 4
4 5
5 6
6 7
7 8
8 9

Dabei bezeichnet die erste Spalte den Index des Elements und die zweite Spalte die Elemente selbst.

In einem Wörterbuch

enumm = {0: 1, 1: 2, 2: 3, 4: 4, 5: 5, 6: 6, 7: 7}
for i, j in enumerate(enumm):
    print(i, j)

es gibt die Ausgabe

0 0
1 1
2 2
3 4
4 5
5 6
6 7

Dabei gibt die erste Spalte den Index der key:valuePaare und die zweite Spalte den Index des keysWörterbuchs an enumm.

Wenn Sie also möchten, dass die erste Spalte die keyszweite und die zweite Spalte ist values, probieren Sie besser dict.iteritems()(Python 2) oder dict.items()(Python 3) aus.

for i, j in enumm.items():
    print(i, j)

Ausgabe

0 1
1 2
2 3
4 4
5 5
6 6
7 7

Voila

Abhishek Roy
quelle
1
Dies gilt nicht für Wörterbücher. Ihr Code durchläuft das Wörterbuch mithilfe eines Index (für die Iteration), ohne jedoch die Schlüssel-Wert-Kombinationen des Wörterbuchs anzugeben. Verwenden Sie stattdessen dict.items ().
Matthias
Ja, Sie können auch mit dict.items () fortfahren. Danke für die Korrektur.
Abhishek Roy
3

Das muss sicher verwirrend erscheinen. Das ist also was los ist. Der erste Wert von enumerate (in diesem Fall i) gibt den nächsten Indexwert zurück, der bei 0 beginnt, also 0, 1, 2, 3, ... Diese Zahlen werden immer zurückgegeben, unabhängig davon, was im Wörterbuch enthalten ist. Der zweite Wert von enumerate (in diesem Fall j) gibt die Werte in Ihrem Wörterbuch / enumm zurück (wir nennen es ein Wörterbuch in Python). Was Sie wirklich tun möchten, ist, worauf roadrunner66 reagiert hat.

wp-overwatch.com
quelle
3
  1. Das Iterieren über ein Python-Diktat bedeutet, dass die Schlüssel genauso durchlaufen werden wie mit dict.keys()
  2. Die Reihenfolge der Schlüssel wird durch den Implementierungscode bestimmt, und Sie können keine bestimmte Reihenfolge erwarten:

    Schlüssel und Werte werden in einer beliebigen Reihenfolge wiederholt, die nicht zufällig ist, je nach Python-Implementierung variiert und von der Historie der Einfügungen und Löschungen im Wörterbuch abhängt. Wenn Schlüssel-, Werte- und Elementansichten ohne dazwischen liegende Änderungen am Wörterbuch wiederholt werden, entspricht die Reihenfolge der Elemente direkt.

Deshalb sehen Sie in der ersten Spalte die Indizes 0 bis 7. Sie werden von hergestellt enumerateund sind immer in der richtigen Reihenfolge. Weiter sehen Sie die Tasten 0 bis 7 des Diktats in der zweiten Spalte. Sie sind nicht sortiert.

VPfB
quelle
3

Python3:

Eine Lösung:

enumm = {0: 1, 1: 2, 2: 3, 4: 4, 5: 5, 6: 6, 7: 7}
for i, k in enumerate(enumm):
    print("{}) d.key={}, d.value={}".format(i, k, enumm[k]))

Output:
0) enumm.key=0, enumm.value=1
1) enumm.key=1, enumm.value=2
2) enumm.key=2, enumm.value=3
3) enumm.key=4, enumm.value=4
4) enumm.key=5, enumm.value=5
5) enumm.key=6, enumm.value=6
6) enumm.key=7, enumm.value=7

Ein weiteres Beispiel:

d = {1 : {'a': 1, 'b' : 2, 'c' : 3},
     2 : {'a': 10, 'b' : 20, 'c' : 30}
    }    
for i, k in enumerate(d):
        print("{}) key={}, value={}".format(i, k, d[k])

Output:    
    0) key=1, value={'a': 1, 'b': 2, 'c': 3}
    1) key=2, value={'a': 10, 'b': 20, 'c': 30}
Kostiantyn Medvid
quelle
1
d = {0: 'zero', '0': 'ZERO', 1: 'one', '1': 'ONE'}

print("List of enumerated d= ", list(enumerate(d.items())))

Ausgabe:

List of enumerated d=  [(0, (0, 'zero')), (1, ('0', 'ZERO')), (2, (1, 'one')), (3, ('1', 'ONE'))]
user3358337
quelle
0

Es kann nützlich sein, den Index in den Schlüssel aufzunehmen:

d = {'a': 1, 'b': 2}
d = {(i, k): v for i, (k, v) in enumerate(d.items())}

Ausgabe:

{(0, 'a'): True, (1, 'b'): False}
GGGuser
quelle