enumerate () dla słownika w Pythonie

84

Wiem, że używamy enumeratedo iteracji listy, ale próbowałem to w słowniku i nie spowodowało to błędu.

KOD:

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

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

WYNIK:

0 0

1 1

2 2

3 4

4 5

5 6

6 7

Czy ktoś może wyjaśnić wynik?

Aditya Krishn
źródło
2
for i, j in enumerate(enumm) jest izwiększany przy każdej iteracji i jprzechwytuje zwykły element z enumerateargumentu funkcji, którym w tym przypadku jest słownik. Iterowanie po dyktach jest zasadniczo iteracją po jego kluczach.
Divyanshu Srivastava

Odpowiedzi:

119

Oprócz już udzielonych odpowiedzi w Pythonie jest bardzo ładny wzorzec, który pozwala wyliczyć zarówno klucze, jak i wartości słownika.

W normalnym przypadku wyliczasz klucze słownika:

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

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

Które wyjścia:

0 1
1 2
2 3
3 4

Ale jeśli chcesz wyliczyć zarówno klucze, jak i wartości, jest to sposób:

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

Które wyjścia:

0 1 a
1 2 b
2 3 c
3 4 d
João Almeida
źródło
1
(+1) Możesz również po prostu użyć dictionary.items()(bez wyliczania), aby uzyskać obiekt widoku z parami klucz-wartość jako listę krotek.
Tiago Martins Peres 李大仁
62

Pierwsza kolumna danych wyjściowych to indeks każdego elementu w, enumma druga to jego klucze. Jeśli chcesz iterować swój słownik, użyj .items ():

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

Wynik powinien wyglądać następująco:

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

źródło
32

Pomyślałem, że dodam, jeśli chcesz wyliczyć indeks, klucz i wartości słownika, twoja pętla for powinna wyglądać następująco:

for index, (key, value) in enumerate(your_dict.items()):
    print(index, key, value)
Jordan Mackie
źródło
3
To pytanie dotyczy kwestii składniowych, a ta odpowiedź dostarczyła najkrótszego rozwiązania dwóch dodanych nawiasów:idx, (k, v) in enumerate(d.items()):
Sean Pianka
1
Cześć Sean, nie jestem pewien, czy zgadzasz się z odpowiedzią, czy po prostu mówisz, że krótsze nazwy zmiennych zapewniają lepszą odpowiedź?
Jordan Mackie,
26
dict1={'a':1, 'b':'banana'}

Aby wyświetlić słownik w Pythonie 2.x:

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

W Pythonie 3.x użyj:

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

Wreszcie, jak wskazali inni, jeśli chcesz mieć działający indeks, możesz go również mieć:

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

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

Ale to podważa cel słownika (mapa, tablica asocjacyjna) , który jest wydajną strukturą danych do wyszukiwania w stylu książki telefonicznej. Porządkowanie słownika może być przypadkowe w przypadku implementacji i nie należy na nim polegać. Jeśli potrzebujesz zamówienia, użyj zamiast tego OrderedDict .

roadrunner66
źródło
2
Nie pozwala mi na edycję 2 znaków w tym poście, ale OP oznaczył to jako dla Pythona 3, więc instrukcja print musi mieć nawiasy wokół k, v.
wp-overwatch.com
@Pan. Ja, ty, naprawię.
roadrunner66
19
Należy zauważyć, że jest to dostępne tylko dla python2. dict.iteritems () zostało usunięte w python3, zobacz także stackoverflow.com/questions/30418481/…
gyger
1
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
lkahtz
Ty. Zaktualizowano Python3 vs Python2. Dodano komentarz do wyliczenia.
roadrunner66
5

Ponieważ używasz, enumeratetwój ijest w rzeczywistości indeksem klucza, a nie samym kluczem.

Więc dostajesz się 3do pierwszej kolumny wiersza, 3 4mimo że nie ma klucza 3.

enumerate wykonuje iterację w strukturze danych (czy to na liście, czy w słowniku), jednocześnie podając bieżący numer iteracji.

Stąd kolumny tutaj to numer iteracji, po którym następuje klucz w słowniku enum

Inne rozwiązania pokazały już, jak iterować po parze klucz i wartość, więc nie powtórzę tego samego w moim.

Ankur Ranjan
źródło
4

enumerate()podczas pracy na liście faktycznie podaje indeks i wartość elementów wewnątrz listy. Na przykład:

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

daje

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

gdzie pierwsza kolumna oznacza indeks pozycji, a druga kolumna oznacza same pozycje.

W słowniku

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

daje wynik

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

gdzie pierwsza kolumna zawiera indeks key:valuepar, a druga kolumna oznacza keyssłownik enumm.

Więc jeśli chcesz, aby pierwsza kolumna była, keysa druga kolumna values, lepiej wypróbuj dict.iteritems()(Python 2) lub dict.items()(Python 3)

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

wynik

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

Voila

Abhishek Roy
źródło
1
Nie dotyczy to słowników. Twój kod będzie iterował po słowniku używając indeksu (dla iteracji), ale nie podając kombinacji klucz-wartość słownika. Zamiast tego użyj dict.items ().
Matthias
tak, możesz również przejść dalej z dict.items (). Dziękuję za poprawienie mnie.
Abhishek Roy
3

To z pewnością musi wydawać się zagmatwane. Więc to się dzieje. Pierwsza wartość enumerate (w tym przypadku i) zwraca następną wartość indeksu zaczynającą się od 0, więc 0, 1, 2, 3, ... Zawsze zwróci te liczby, niezależnie od tego, co znajduje się w słowniku. Druga wartość enumerate (w tym przypadku j) zwraca wartości w twoim słowniku / enumm (w Pythonie nazywamy to słownikiem). To, co naprawdę chcesz zrobić, to odpowiedź roadrunner66.

wp-overwatch.com
źródło
3
  1. Iterowanie po dyktandzie Pythona oznacza iterację po jego kluczach dokładnie w taki sam sposób, jak w przypadku dict.keys()
  2. Kolejność kluczy jest określona przez kod implementacji i nie można oczekiwać jakiejś konkretnej kolejności:

    Klucze i wartości są iterowane w dowolnej kolejności, która nie jest losowa, różni się w zależności od implementacji języka Python i zależy od historii wstawiania i usuwania w słowniku. Jeśli klucze, wartości i widoki elementów są iterowane bez żadnych modyfikacji słownika, kolejność elementów będzie bezpośrednio odpowiadać.

Dlatego w pierwszej kolumnie widzisz indeksy od 0 do 7. Są produkowane przez enumeratei zawsze znajdują się we właściwej kolejności. Dalej widać klawisze dyktowania od 0 do 7 w drugiej kolumnie. Nie są sortowane.

VPfB
źródło
3

Python3:

Jedno rozwiązanie:

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

Inny przykład:

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
źródło
1
d = {0: 'zero', '0': 'ZERO', 1: 'one', '1': 'ONE'}

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

wynik:

List of enumerated d=  [(0, (0, 'zero')), (1, ('0', 'ZERO')), (2, (1, 'one')), (3, ('1', 'ONE'))]
user3358337
źródło
0

Może się przydać umieszczenie indeksu w kluczu:

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

Wynik:

{(0, 'a'): True, (1, 'b'): False}
GGGuser
źródło