enumerate () для словника на python


85

Я знаю, що ми використовуємо 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аргументу функції, який у цьому випадку є словником. Ітерація над диктами, по суті, ітерація над її ключами.
Дів'яншу Шрівастава

Відповіді:


120

Зверху на вже надані відповіді є дуже приємний шаблон у 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()(без перерахування), щоб отримати об'єкт подання з парами ключ-значення у вигляді списку кортежів.
Тіаго Мартінс Перес,

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
Це не дозволяє мені редагувати 2 символи в цій публікації, але OP позначив це як таке, що стосується Python 3, тому оператор print повинен мати дужки навколо k, v.
wp-overwatch.com

@Містер. Я, тай, виправлю.
roadrunner66

19
Це слід зазначити, доступно лише для python2. dict.iteritems () був вилучений в Python3, дивіться також stackoverflow.com/questions/30418481 / ...
gyger

1
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
lkahtz

Тай Оновлено python3 проти python2. Додано коментар до переліку.
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

де перший стовпець позначає індекс товару, а 2-й стовпець позначає самі предмети.

У словнику

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 (). Дякую за виправлення.
Абхішек Рой

3

Це, мабуть, здається заплутаним. Отже, це те, що відбувається. Перше значення enumerate (у цьому випадку i) повертає наступне значення індексу, починаючи з 0, тож 0, 1, 2, 3, ... Завжди повертає ці числа, незалежно від того, що є у словнику. Друге значення enumerate (у цьому випадку j) повертає значення у вашому словнику / enumm (ми називаємо це словником на Python). Що ви дійсно хочете зробити, це те, що відповів roadrunner66.


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

    Клавіші та значення повторюються у довільному порядку, який є невипадковим, варіюється в різних реалізаціях Python і залежить від історії вставки та видалення словника. Якщо ключі, значення та подання елементів переглядаються без втручання в словник, порядок елементів буде безпосередньо відповідати.

Ось чому ви бачите індекси від 0 до 7 у першому стовпці. Вони виготовляються enumerateі завжди мають правильний порядок. Далі ви бачите клавіші дикту від 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.