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 .


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.


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

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

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


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'))]

0

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

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

Вывод:

{(0, 'a'): True, (1, 'b'): False}
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.