Вопрос: Итерация над словарями с использованием циклов 'for'


Я немного озадачен следующим кодом:

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

Я не понимаю, что keyчасть. Как Python распознает, что ему нужно только прочитать ключ из словаря? Является keyспециальное слово в Python? Или это просто переменная?


2024


источник


Ответы:


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)пары, которые не будут отражать изменения в dict, которые происходят после items()вызов. Если вы хотите поведение 2.x в 3.x, вы можете позвонить list(d.items()),


3642



Это не тот ключ, это специальное слово, но словари реализуют протокол итератора. Вы можете сделать это в своем классе, например. видеть этот вопрос как создавать итераторы классов.

В словарях он реализован на уровне C. Подробности доступны в 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(),


318



Итерация по 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как имена переменных при циклировании по 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))

146



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)

41



Когда вы повторяете словари, используя for .. in ..-syntax, он всегда выполняет итерации по клавишам (значения доступны с использованием dictionary[key]).

Чтобы перебрать пары ключ-значение, используйте for k,v in s.iteritems(),


38



Это очень распространенная идиотская петля. inявляется оператором. Когда использовать for key in dictи когда это должно быть for key in dict.keys()видеть Статья Идиоматического Питона Дэвида Гудгера ,


19



Вы можете использовать это:

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

8



I have a use case where I have to iterate through the dict to get the key, value pair, also the index indicating where I am. This is how I do it:

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

Note that the parentheses around the key, value is important, without the parentheses, you get an ValueError "not enough values to unpack".


4