Перебор словарей с использованием циклов for
d = {'x': 1, 'y': 2, 'z': 3}
for key in d:
...
Как Python распознает, что ему нужно только прочитать ключ из
толковый словарь? Ключ - это особое слово в Python? Или это просто
переменная?
Это не просто for
петли. Важное слово здесь - «повторение».
Словарь - это сопоставление ключей со значениями:
d = {'x': 1, 'y': 2, 'z': 3}
Каждый раз, когда мы перебираем его, мы перебираем ключи. Имя переменной key
предназначено только для описания - и вполне подходит для этой цели.
Это происходит в понимании списка:
>>> [k for k in d]
['x', 'y', 'z']
Это происходит, когда мы передаем словарь в список (или любой другой объект типа коллекции):
>>> list(d)
['x', 'y', 'z']
Способ итерации Python заключается в том, что в контексте, где это необходимо, он вызывает метод __iter__
объекта (в данном случае словарь), который возвращает итератор (в данном случае объект keyiterator):
>>> d.__iter__()
<dict_keyiterator object at 0x7fb1747bee08>
Мы не должны сами использовать эти специальные методы, вместо этого используйте для их вызова соответствующую встроенную функцию, iter
:
>>> key_iterator = iter(d)
>>> key_iterator
<dict_keyiterator object at 0x7fb172fa9188>
Итераторы имеют метод __next__
, но мы вызываем его с помощью встроенной функции, next
:
>>> next(key_iterator)
'x'
>>> next(key_iterator)
'y'
>>> next(key_iterator)
'z'
>>> next(key_iterator)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
Когда итератор исчерпан, он вызывает StopIteration
. Вот как Python знает, что нужно выйти из цикла for
, или понимания списка, или выражения генератора, или любого другого итеративного контекста. Как только итератор поднимает StopIteration
, он всегда будет повышать его - если вы хотите повторить итерацию снова, вам понадобится новый.
>>> list(key_iterator)
[]
>>> new_key_iterator = iter(d)
>>> list(new_key_iterator)
['x', 'y', 'z']
Возвращение к dicts
Мы видели, как словарный запас повторяется во многих контекстах. Мы видели, что каждый раз, когда мы перебираем dict, мы получаем ключи. Вернемся к исходному примеру:
d = {'x': 1, 'y': 2, 'z': 3}
for key in d:
Если мы изменим имя переменной, мы все равно получим ключи. Попробуем:
>>> for each_key in d:
... print(each_key, '=>', d[each_key])
...
x => 1
y => 2
z => 3
Если мы хотим перебрать значения, нам нужно использовать метод dicts .values
или для обоих вместе, .items
:
>>> list(d.values())
[1, 2, 3]
>>> list(d.items())
[('x', 1), ('y', 2), ('z', 3)]
В приведенном примере было бы более эффективно перебирать элементы следующим образом:
for a_key, corresponding_value in d.items():
print(a_key, corresponding_value)
Но для академических целей пример вопроса подойдет.
Как мы знаем, в Словаре Python как набор пар ключ: значение с требованием, чтобы ключи были уникальными (в пределах одного словаря). Пара скобок создает пустой словарь: {}. Помещение разделенного запятыми списка пар ключ: значение в фигурные скобки добавляет в словарь начальные пары ключ: значение. Нет, ключ - это не особое слово в Python. Здесь ключ - это просто имя переменной.
вы пробовали:
for key, value in d.items():
?