Я немного озадачен следующим кодом:
d = {'x': 1, 'y': 2, 'z': 3}
for key in d:
print key, 'corresponds to', d[key]
То, что я не понимаю, это key
часть. Как Python распознает, что ему нужно только прочитать ключ из словаря? Это key
особое слово в Python? Или это просто переменная?
python
python-2.7
dictionary
TopChef
источник
источник
Ответы:
key
это просто имя переменной.будет просто перебирать ключи в словаре, а не ключи и значения. Чтобы перебрать ключ и значение, вы можете использовать следующее:
Для Python 3.x:
Для Python 2.x:
Чтобы проверить себя, измените слово
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())
.источник
sorted
необходимы для его стабилизации.Keys and values are iterated over in insertion order.
[ docs.python.org/3/library/…Дело не в том, что ключ - это особое слово, а в том, что словари реализуют протокол итератора. Вы можете сделать это в своем классе, например, посмотреть этот вопрос о том, как создавать итераторы класса.
В случае словарей это реализовано на уровне C. Детали доступны в PEP 234 . В частности, раздел под названием «Словарь итераторов»:
В Python 3
dict.iterkeys()
,dict.itervalues()
иdict.iteritems()
более не поддерживается. Используйтеdict.keys()
,dict.values()
иdict.items()
вместо этого.источник
Итерация по
dict
итерирует по его ключам в произвольном порядке, как вы можете видеть здесь:Изменить: (Это больше не так в Python3.6 , но обратите внимание, что это еще не гарантированное поведение)
Для вашего примера лучше использовать
dict.items()
:Это дает вам список кортежей. Когда вы зацикливаете их вот так, каждый кортеж распаковывается
k
иv
автоматически:Использование
k
и вv
качестве имен переменных при зацикливании над adict
довольно распространено, если тело цикла состоит всего из нескольких строк. Для более сложных циклов может быть полезно использовать более описательные имена:Это хорошая идея, чтобы привыкнуть использовать строки формата:
источник
key
это просто переменная.Для Python2.X :
... или лучше,
Для Python3.X :
источник
Когда вы перебираете словари, используя
for .. in ..
-syntax, он всегда перебирает ключи (значения доступны с помощьюdictionary[key]
).Для перебора пар ключ-значение в Python 2
for k,v in s.iteritems()
и в Python 3for k,v in s.items()
.источник
items()
вместоiteritems()
Это очень распространенная идиома.
in
это оператор. О том, когдаfor key in dict
и когда его использовать, можно прочитать вfor key in dict.keys()
статье «Идиоматический Python» Дэвида Гуджера (архивная копия) .источник
in
, операторская часть - это место, где вы проверяете существование . Может быть, лучше удалить этуin is an operator
информацию.Это не просто
for
петли. Важное слово здесь - «повторение».Словарь - это отображение ключей на значения:
Каждый раз, когда мы перебираем его, мы перебираем ключи. Имя переменной
key
предназначено только для описания, и оно вполне подходит для этой цели.Это происходит в понимании списка:
Это происходит, когда мы передаем словарь в список (или любой другой объект типа коллекции):
Итерация Python заключается в том, что в контексте, где это необходимо, он вызывает
__iter__
метод объекта (в данном случае словарь), который возвращает итератор (в данном случае, объект keyiterator):Мы не должны сами использовать эти специальные методы, вместо этого использовать соответствующую встроенную функцию для вызова
iter
:У итераторов есть
__next__
метод, но мы вызываем его с помощью встроенной функцииnext
:Когда итератор исчерпан, он повышается
StopIteration
. Это то, как Python знает, как выйти изfor
цикла, или из списка, или из выражения генератора, или из любого другого итеративного контекста. Когда итератор поднимается,StopIteration
он всегда поднимает его - если вы хотите повторить снова, вам нужен новый.Возвращаясь к диктату
Мы видели повторения диктов во многих контекстах. Что мы видели, так это то, что каждый раз, когда мы перебираем слова, мы получаем ключи. Вернуться к исходному примеру:
Если мы изменим имя переменной, мы все равно получим ключи. Давай попробуем:
Если мы хотим перебрать значения, нам нужно использовать
.values
метод dicts или для обоих вместе.items
:В приведенном примере было бы более эффективно перебирать элементы вроде этого:
Но для академических целей пример вопроса просто отлично.
источник
У меня есть сценарий использования, где я должен пройти через dict, чтобы получить ключ, пару значений, а также индекс, указывающий, где я нахожусь. Вот как я это делаю:
Обратите внимание, что круглые скобки вокруг ключа, значения важны, без скобок вы получите ValueError «недостаточно значений для распаковки».
источник
Вы можете проверить реализацию CPython
dicttype
на GitHub. Это сигнатура метода, который реализует итератор dict:CPython dictobject.c
источник
Перебирать ключи медленнее, но лучше использовать
my_dict.keys()
. Если вы пытались сделать что-то вроде этого:это приведет к ошибке во время выполнения, потому что вы меняете ключи во время работы программы. Если вы абсолютно настроены на сокращение времени, используйте
for key in my_dict
способ, но вас предупредили;).источник
Это напечатает вывод в отсортированном порядке по значениям в порядке возрастания.
Вывод:
источник