'слишком много значений, чтобы распаковать', итерируя по диктату. ключ => строка, значение => список

323

Я получаю 'too many values to unpack'ошибку. Любая идея, как я могу это исправить?

first_names = ['foo', 'bar']
last_names = ['gravy', 'snowman']

fields = {
    'first_names': first_names,
    'last_name': last_names,
}        

for field, possible_values in fields:  # error happens on this line              
Типу
источник

Ответы:

478

Python 2

Вам нужно использовать что-то вроде iteritems.

for field, possible_values in fields.iteritems():
    print field, possible_values

Посмотрите этот ответ для получения дополнительной информации об итерациях по словарям, таких как использование в items()разных версиях Python.

Python 3

Так как Python 3 iteritems() не больше не поддерживается . Используйте items()вместо этого.

for field, possible_values in fields.items():
    print(field, possible_values)
Филип Саутам
источник
88
Что касается того, почему вам нужно сделать это, перебор словаря перебирает ключи, а не пары ключ / значение.
Джефф Меркадо
1
@jeffm вот что меня смутило. я видел это как PHP foreach.
Типу
79

Для Python 3.x iteritemsбыл удален. Используйте предметы вместо.

for field, possible_values in fields.items():
    print(field, possible_values)
Meistro
источник
37

Вы хотите использовать iteritems . Это возвращает итератор по словарю, который дает вам кортеж (ключ, значение)

>>> for field, values in fields.iteritems():
...     print field, values
... 
first_names ['foo', 'bar']
last_name ['gravy', 'snowman']

Ваша проблема заключалась в том, что вы перебирали поля, которые возвращали ключи словаря.

>>> for field in fields:
...     print field
... 
first_names
last_name
Майк Льюис
источник
9

Для списков используйте enumerate

for field, possible_values in enumerate(fields):
    print(field, possible_values)

iteritems не будет работать для объектов списка

Иордания
источник
Это должен быть правильный ответ (проверено) для Python 2.7 как минимум.
навоз
1

В Python3 iteritems()больше не поддерживается

РЕШЕНИЕ1 :

использование .items

for field, possible_values in fields.items():
    print(field, possible_values)

РЕШЕНИЕ2 :

Вы можете использовать , enumerate()а также

for field, possible_values in enumerate(fields):
    print(field, possible_values)
ishandutta2007
источник
0

Нельзя повторять прямо в словаре. Таким образом, вы можете преобразовать в кортеж .

first_names = ['foo', 'bar']
last_names = ['gravy', 'snowman']

fields = {
    'first_names': first_names,
    'last_name': last_names,
         } 
tup_field=tuple(fields.items())
for names in fields.items():
     field,possible_values = names
     tup_possible_values=tuple(possible_values)
     for pvalue in tup_possible_values:
           print (field + "is" + pvalue)
сатья нараян пардхи
источник
Пожалуйста, объясните свой ответ.
Мацей Юречко
Нельзя повторять прямо в словаре. Таким образом, вы можете преобразовать в кортеж.
Сатья Нараян Парди
0

вы отсутствуют fields.iteritems()в вашем коде.

Вы также можете сделать это другим способом, где вы получаете значения, используя ключи в словаре.

for key in fields:
    value = fields[key]
Вайбхав Десаи
источник
0
data = (['President','George','Bush','is','.'],['O','B-PERSON','I-PERSON','O','O'])
corpus = []
for(doc,tags) in data:
    doc_tag = []
    for word,tag in zip(doc,tags):
        doc_tag.append((word,tag))
        corpus.append(doc_tag)
        print(corpus)
Sakshi
источник
4
Добро пожаловать в стек переполнения! Как правило, ответы гораздо полезнее, если они включают в себя объяснение того, для чего предназначен код, и почему это решает проблему, не представляя других.
Тим Дикманн