enumerate () для словаря в Python

84

Я знаю, что мы используем enumerateдля итерации списка, но я попробовал это в словаре, и он не дал ошибки.

КОД:

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

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

ВЫВОД:

0 0

1 1

2 2

3 4

4 5

5 6

6 7

Может кто-нибудь объяснить вывод?

Адитья Кришн
источник
2
for i, j in enumerate(enumm) получает iприращение на каждой итерации и jзахватывает обычный элемент из enumerateаргумента функции, который в данном случае является словарем. Перебор dicts, по сути, перебирает его ключи.
Дивяншу Шривастава

Ответы:

119

В дополнение к уже предоставленным ответам в Python есть очень хороший шаблон, который позволяет вам перечислять как ключи, так и значения словаря.

Обычный случай, когда вы перечисляете ключи словаря:

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

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

Какие выходы:

0 1
1 2
2 3
3 4

Но если вы хотите перечислить как ключи, так и значения, это способ:

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

Какие выходы:

0 1 a
1 2 b
2 3 c
3 4 d
Жуан Алмейда
источник
1
(+1) Вы также можете просто использовать dictionary.items()(без перечисления), чтобы получить объект представления с парами ключ-значение в виде списка кортежей.
Tiago Martins Peres 李大仁
62

Первый столбец вывода - это индекс каждого элемента, enummа второй - его ключи. Если вы хотите перебрать свой словарь, используйте .items ():

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

И результат должен выглядеть так:

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

источник
33

Просто подумал, что добавлю, если вы хотите перечислить индекс, ключ и значения словаря, ваш цикл for должен выглядеть так:

for index, (key, value) in enumerate(your_dict.items()):
    print(index, key, value)
Джордан Маки
источник
3
Этот вопрос связан с проблемами синтаксиса, и этот ответ дает кратчайшее решение двух добавленных круглых скобок:idx, (k, v) in enumerate(d.items()):
Шон Пьянка
1
Привет, Шон, я не уверен, согласны ли вы с ответом или просто говорите, что более короткие имена переменных дают лучший ответ?
Jordan Mackie
26
dict1={'a':1, 'b':'banana'}

Чтобы перечислить словарь в Python 2.x:

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

В Python 3.x используйте:

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

Наконец, как указывали другие, если вам нужен работающий индекс, вы тоже можете его:

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

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

Но это лишает смысла словарь (карта, ассоциативный массив) , который является эффективной структурой данных для поиска в стиле телефонной книги. Упорядочивание словаря может быть связано с реализацией, и на него нельзя полагаться. Если вам нужен порядок, используйте вместо него OrderedDict .

Roadrunner66
источник
2
Это не позволяет мне редактировать этот пост, состоящий из двух символов, но OP пометил это как для Python 3, поэтому оператор печати должен заключать в скобки k, v.
wp-overwatch.com
@Г-н. Меня, ты, исправлю.
roadrunner66
19
Следует отметить, что это доступно только для python2. dict.iteritems () был удален в python3, см. также stackoverflow.com/questions/30418481/…
gyger
1
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
lkahtz
Ty. Обновлен python3 против python2. Добавлен комментарий к enumerate.
roadrunner66
5

Поскольку вы используете, enumerateследовательно, ваш iфактически индекс ключа, а не сам ключ.

Итак, вы попадаете 3в первый столбец строки, 3 4хотя ключа нет 3.

enumerate выполняет итерацию по структуре данных (будь то список или словарь), одновременно предоставляя текущий номер итерации.

Следовательно, столбцы здесь - это номер итерации, за которым следует ключ в словаре. enum

Другие решения уже показали, как перебирать пару ключей и значений, поэтому я не буду повторять то же самое в своем.

Анкур Ранджан
источник
4

enumerate()при работе со списком фактически дает индекс и значение элементов внутри списка. Например:

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

дает

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

где первый столбец обозначает индекс элемента, а второй столбец обозначает сами элементы.

В словаре

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

он дает результат

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

где первый столбец дает индекс key:valueпар, а второй столбец обозначает keysсловарьenumm .

Поэтому, если вы хотите, чтобы первый столбец был keysвторым, а второй столбец values, лучше попробовать dict.iteritems()(Python 2) или dict.items()(Python 3)

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

вывод

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

Вуаля

Абхишек Рой
источник
1
Это не относится к словарям. Ваш код будет перебирать словарь, используя индекс (для итерации), но не давая комбинации значений ключа словаря. Вместо этого используйте dict.items ().
Матиас
да, вы также можете использовать dict.items (). Спасибо за исправление.
Abhishek Roy
3

Это наверняка может сбивать с толку. Так вот что происходит. Первое значение enumerate (в данном случае i) возвращает следующее значение индекса, начиная с 0, поэтому 0, 1, 2, 3, ... Он всегда будет возвращать эти числа независимо от того, что находится в словаре. Второе значение enumerate (в данном случае j) возвращает значения в вашем словаре / enumm (мы называем это словарем в Python). Что вы действительно хотите сделать, так это то, чем ответил roadrunner66.

wp-overwatch.com
источник
3
  1. Итерация по Python dict означает итерацию по его ключам точно так же, как с dict.keys()
  2. Порядок ключей определяется кодом реализации, и вы не можете ожидать определенного порядка:

    Ключи и значения повторяются в произвольном порядке, который не является случайным, зависит от реализаций Python и зависит от истории вставок и удалений словаря. Если ключи, значения и представления элементов повторяются без каких-либо изменений в словаре, порядок элементов будет напрямую соответствовать.

Вот почему вы видите индексы от 0 до 7 в первом столбце. Они производятся enumerateи всегда находятся в правильном порядке. Далее вы видите ключи dict от 0 до 7 во втором столбце. Они не отсортированы.

VPfB
источник
3

Python3:

Одно решение:

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

Другой пример:

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}
Константин Медвид
источник
1
d = {0: 'zero', '0': 'ZERO', 1: 'one', '1': 'ONE'}

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

вывод:

List of enumerated d=  [(0, (0, 'zero')), (1, ('0', 'ZERO')), (2, (1, 'one')), (3, ('1', 'ONE'))]
user3358337
источник
0

Возможно, вам будет полезно включить индекс внутри ключа:

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

Вывод:

{(0, 'a'): True, (1, 'b'): False}
GGGuser
источник