Использование .iteritems () для итерации по ключу, значение в словаре Python

Примечание. Я прочитал этот пост и ответ Алекс Мартелли , но я не совсем / полностью не понимаю его ответа. Это немного отличается от моего нынешнего понимания. Я хотел бы помочь лучше понять это.

Я понимаю, что когда вы пытаетесь использовать следующий цикл:

for key, value in dict: print key print value 

Вы получаете:

 ValueError: too many values to unpack 

Хотя вы можете перебрать словарь и просто получить ключи со следующим:

 for key in dict: print key 

Может ли кто-нибудь дать немного менее расширенное объяснение того, почему вы не можете перебирать словарь с помощью ключа, значение без использования .iteritems() ?

Другой ответ объясняет это хорошо. Но вот еще несколько иллюстраций того, как он себя ведет, показывая случаи, когда он действительно работает без ошибок (так что вы можете что-то увидеть):

 >>> 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 AB CD 

Я предполагаю, что в вашем случае это было что-то вроде этого?

 >>> 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 есть функция, называемая iterable распаковкой. Когда вы это сделаете

 a, b = thing 

Python предполагает, thing – это кортеж или список или что-то еще с двумя элементами, и он назначает первый и второй элементы 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 вы фактически используете итератор для итерации XX, а 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() возвращает другой итератор, он может получить комбинацию сочетания клавиш. Давайте проверим это

 >>> 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) словаря с помощью dict.has_key(property_name) .