Питання Ітерації над словниками, використовуючи "для" циклів


Я трохи здивувався наступним кодом:

d = {'x': 1, 'y': 2, 'z': 3} 
for key in d:
    print key, 'corresponds to', d[key]

Те, що я не розумію, це key порція Як Python усвідомлює, що потрібно лише прочитати ключ із словника? Є key спеціальне слово в Python? Або це просто змінна?


2112
2017-07-20 22:27


походження




Відповіді:


key це просто ім'я змінної.

for key in d:

буде просто петлі над ключами в словнику, а не ключами та значеннями. Для переходу на обидві клавіші та значення, ви можете використовувати наступне:

Для Python 2.x:

for key, value in d.iteritems():

Для Python 3.x:

for key, value in d.items():

Щоб випробувати себе, змініть слово key до poop.

Для Python 3.x, iteritems() був просто заміщений items(), який повертає налаштування, подібне до якого висувається dict iteritems() але ще краще. Це також доступне в 2.7 viewitems().

Операція items() буде працювати як на 2, так і на 3, але в 2 він поверне список словника (key, value) пари, які не відображають змін у дикту, що трапляються після items() дзвонити Якщо ви хочете поведінку 2.x в 3.x, ви можете зателефонувати list(d.items()).


3804
2017-07-20 22:29



Додавання неприйнятої причини для недоступності такого значення: d [ключ] всередині для циклу для причини повторення кешу (для отримання значення). Коли словник великий, цей додатковий хеш збільшить загальний час. Це обговорюється в технічних розмовах Раймона Хеттінгера youtube.com/watch?v=anrOzOapJ2E - Harisankar Krishna Swamy
в Python 3.6 змінено як d.items() - Decoded
Хороша відповідь, і справжній геній полягає у зміні key до poop. Дякую за розуміння, @ sberry! - Mike Williamson


Це не той ключ, це спеціальне слово, але ці словники реалізують протокол ітератора. Ви можете це зробити у своєму класі, наприклад побачити це питання як створити ітератори класу.

У словниках вона реалізується на рівні С. Подробиці доступні в PEP 234. Зокрема, розділ під назвою "Ітератори словників":

  • Словники реалізують слот tp_iter, який повертає ефективний   ітератор, який повторюється над клавішами словника. [...] Це   означає, що ми можемо писати

    for k in dict: ...
    

    що еквівалентно, але набагато швидше, ніж

    for k in dict.keys(): ...
    

    поки обмеження на модифікації словника   (або циклом, або іншим потоком) не порушуються.

  • Додайте методи до словників, які повертають різні типи   ітератори явно:

    for key in dict.iterkeys(): ...
    
    for value in dict.itervalues(): ...
    
    for key, value in dict.iteritems(): ...
    

    Це означає що for x in dict це скорочення для for x in dict.iterkeys().


325
2017-07-20 23:52



У python3 dict.iterkeys (), dict.itervalues ​​() та dict.iteritems () більше не підтримуються. Замість цього використовуйте dict.keys (), dict.values ​​() та dict.items (). - Sadik


Ітерація над a dict повторюється ключами без певного порядку, як ви можете побачити тут:

Редагувати: (це є це вже не справа Python3.6, але зауважте, що це є не гарантовано поведінка ще)

>>> d = {'x': 1, 'y': 2, 'z': 3} 
>>> list(d)
['y', 'x', 'z']
>>> d.keys()
['y', 'x', 'z']

Для вашого прикладу краще використовувати його dict.items():

>>> d.items()
[('y', 2), ('x', 1), ('z', 3)]

Це дасть вам список кортежів. Коли ви циклу над ними, як це, кожний кортеж розпаковується k і v автоматично:

for k,v in d.items():
    print(k, 'corresponds to', v)

Використовуючи k і v як імена змінних при циклі над a dict є досить поширеним, якщо тіло циклу полягає лише в кількох рядках. Для більш складних циклів може бути корисним використовувати більш описові назви:

for letter, number in d.items():
    print(letter, 'corresponds to', number)

Дуже добре потрапити у звичку використовувати рядки формату:

for letter, number in d.items():
    print('{0} corresponds to {1}'.format(letter, number))

151
2017-07-21 01:27



З приміток до випуску Python 3.7: "Захист природи об'єктів dict від порядку вставки - офіційна частина специфікації мови Python". - Gregory Arenius


key це просто змінна.

Для Python2.X:

d = {'x': 1, 'y': 2, 'z': 3} 
for my_var in d:
    print my_var, 'corresponds to', d[my_var]

... або краще

d = {'x': 1, 'y': 2, 'z': 3} 
for the_key, the_value in d.iteritems():
    print the_key, 'corresponds to', the_value

Для Python3.X:

d = {'x': 1, 'y': 2, 'z': 3} 
for the_key, the_value in d.items():
    print(the_key, 'corresponds to', the_value)

44
2017-07-20 23:49





Під час перегляду словників за допомогою for .. in ..-синтаксис, він завжди повторюється над клавішами (значення доступні за допомогою dictionary[key])

Щоб повторювати пари з ключовими значеннями, використовуйте for k,v in s.iteritems().


39
2017-07-20 22:29



Зауважте, що для Python 3 це є items() замість iteritems() - Andreas Fester


Це дуже поширений циклічний ідіом. in є оператором. Для кого використовувати for key in dict і коли це повинно бути for key in dict.keys() побачити Стаття Ідіоатичного Пітона Девід Гудгер.


20
2017-07-20 22:42



Коли я читаю ці розділи про in, операторська частина є де ви перевіряєте існування. Можливо, краще видалити це in is an operator інформація - Wolf


Ви можете використовувати це:

for key,val in d.items():
    print key, 'is the key for ', val

9
2018-01-14 14:42



Його трохи старий пост - Sadi
@Саді Чи вже не так? - Basj


У мене є приклад використання, коли я повинен ітерації через dict, щоб отримати ключ, пари значення, а також індекс, який вказує, де я є. Ось як я це роблю:

d = {'x': 1, 'y': 2, 'z': 3} 
for i, (key, value) in enumerate(d.items()):
   print(i, key, value)

Зверніть увагу, що круглі дужки навколо ключового значення важливе значення, без дужок, ви отримаєте ValueError "не вистачає значень для розпакування".


6
2018-05-25 13:42