"занадто багато значень для розпакування", повторення над дриктом. key => рядок, value => список


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

Пітон 2

Потрібно використовувати щось подібне iteritems.

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

Дивіться цю відповідь для отримання додаткової інформації про ітерацію за допомогою словників, таких як використання items()для версій python.

Пітон 3

Так як Python 3 iteritems() НЕ більше не підтримується . Використовуйте items()замість цього.

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

88
Щодо того, для чого вам потрібно це робити, ітерація над словником повторюється за допомогою клавіш, а не пар ключів / значень.
Джефф Меркадо

1
@jeffm саме це мене бентежило. Я бачив це як провід PHP.
tipu

79

Для Python 3.x iteritemsбуло видалено. Використовуйте натомість елементи .

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

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)

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)

Будь ласка, поясніть свою відповідь.
Мацей Юречко

Неможливо повторити ітерацію безпосередньо у словнику. Тож можна через перетворення в кортеж.
satya narayan pardhi

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)

4
Ласкаво просимо до переповнення стека! Як правило, відповіді набагато корисніші, якщо вони включають пояснення того, що призначений для виконання коду та чому це вирішує проблему, не вводячи інших.
Тім Дікманн
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.