С помощью.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).