Wiem, że używamy enumerate
do 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?
python
python-3.x
dictionary
enumerate
Aditya Krishn
źródło
źródło
for i, j in enumerate(enumm)
jesti
zwiększany przy każdej iteracji ij
przechwytuje zwykły element zenumerate
argumentu funkcji, którym w tym przypadku jest słownik. Iterowanie po dyktach jest zasadniczo iteracją po jego kluczach.Odpowiedzi:
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
źródło
dictionary.items()
(bez wyliczania), aby uzyskać obiekt widoku z parami klucz-wartość jako listę krotek.Pierwsza kolumna danych wyjściowych to indeks każdego elementu w,
enumm
a 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
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)
źródło
idx, (k, v) in enumerate(d.items()):
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 .
źródło
Ponieważ używasz,
enumerate
twóji
jest w rzeczywistości indeksem klucza, a nie samym kluczem.Więc dostajesz się
3
do pierwszej kolumny wiersza,3 4
mimo że nie ma klucza3
.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.
źródło
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:value
par, a druga kolumna oznaczakeys
słownikenumm
.Więc jeśli chcesz, aby pierwsza kolumna była,
keys
a druga kolumnavalues
, lepiej wypróbujdict.iteritems()
(Python 2) lubdict.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
źródło
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.
źródło
dict.keys()
Dlatego w pierwszej kolumnie widzisz indeksy od 0 do 7. Są produkowane przez
enumerate
i zawsze znajdują się we właściwej kolejności. Dalej widać klawisze dyktowania od 0 do 7 w drugiej kolumnie. Nie są sortowane.źródło
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}
źródło
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'))]
źródło
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}
źródło