"занадто багато значень для розпакування", повторення над дриктом. 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.