С помощью.iteritems() для перебора ключа, значения в словаре Python
Примечание: у меня прочитайте этот пост и ответ Алекса Мартелли, но я не совсем/полностью понимать его ответ. Это немного за пределами моего понимания. Я хотел бы помочь лучше понять его.
Я понимаю, что когда вы пытаетесь выполнить следующий цикл:
for key, value in dict:
print key
print value
вы получаете:
ValueError: too many values to unpack
хотя вы можете зациклиться на словаре и просто получить ключи со следующим:
for key in dict:
print key
может ли кто-нибудь предоставить немного менее подробное объяснение того, почему вы не можете перебирать словарь с помощью ключа, значения без использования .iteritems()
?
4 ответов
другой ответ хорошо объясняет это. Но вот еще несколько иллюстраций того, как он ведет себя, показывая случаи, когда он действительно работает без ошибок (так что вы можете что-то увидеть):
>>> d = {(1,2): 3, (4,5): 6}
>>> for k, v in d:
print k, v
1 2
4 5
петля проходит через клавиши (1,2)
и (4,5)
и поскольку эти" случайно " кортежи размера 2, они могут быть назначены k
и v
.
работает и со строками, если они имеют ровно два символа:
>>> d = {"AB":3, "CD":6}
>>> for k, v in d:
print k, v
A B
C D
Я предполагаю, что в вашем это было что-то вроде этого?
>>> d = {"ABC":3, "CD":6}
>>> for k, v in d:
print k, v
Traceback (most recent call last):
File "<pyshell#42>", line 1, in <module>
for k, v in d:
ValueError: too many values to unpack
здесь ключ " ABC " является тройным, и поэтому Python жалуется на попытку распаковать его только на две переменные.
Python имеет функцию, называемую итерабельной распаковкой. Когда вы делаете
a, b = thing
Python предполагает thing
это кортеж или список или что-то с 2 элементами, и он назначает первый и второй элементы a
и b
. Это также работает в for
петли:
for a, b in thing:
эквивалентно
for c in thing:
a, b = c
за исключением того, что он не создает этого c
переменной.
это означает, что если вы делаете
for k, v in d:
Python не может смотреть на то, что вы сказали k, v
вместо k
и дать вам элементы вместо ключей, потому что, возможно, ключи 2-кортежи. Он должен перебирать ключи и пытаться распаковать каждый ключ в k
и v
переменные.
при использовании for xx in XX
, вы на самом деле используете итератор перебирает ХХ, и ХХ должен быть итерируемым. Вы можете использовать iter
функция для получения итератора, как
>>> d = dict(a=1,b=2)
>>> i = iter(d)
>>> i
<dictionary-keyiterator object at 0x6ffff8739f0>
и с помощью next
для доступа к элементам.
>>> next(i)
'a'
так в каждой итерации for k in d
, k
назначается next(i)
и это только ключ без значения. например, в первом раунде итерации
k = 'a'
пока .iteritems()
вернет другой итератор с можно получить кортеж key-value в сочетании. Давайте проверим это
>>> i = d.iteritems()
>>> i
<dictionary-itemiterator object at 0x6ffff873998>
>>> next(i)
('a', 1)
посмотреть? В первом раунде for k, v in d.iteritems()
, мы действительно получаем это задание
k, v = ('a', 1)
таким образом, если вы используете for k, v in d
, вы
k, v = 'a'
это незаконное присвоение.
в Python 2.7.6 кажется, что вы, возможно, захотите проверить подсвойствами словарь с dict.has_key(property_name)
.