„zbyt wiele wartości do rozpakowania”, iteracja po dyktando. klucz => ciąg, wartość => lista

323

Pojawia się 'too many values to unpack'błąd. Masz pomysł, jak to naprawić?

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              
tipu
źródło

Odpowiedzi:

478

Python 2

Musisz użyć czegoś takiego iteritems.

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

Zobacz tę odpowiedź, aby uzyskać więcej informacji na temat iterowania przez słowniki, takie jak używanie items(), w różnych wersjach Pythona.

Python 3

Ponieważ Python 3 nieiteritems() jest już obsługiwany . Użyj items()zamiast tego.

for field, possible_values in fields.items():
    print(field, possible_values)
Philip Southam
źródło
88
Jeśli chodzi o powód, dla którego musisz to zrobić, iteracja po słowniku polega na iteracji po kluczach, a nie parach klucz / wartość.
Jeff Mercado
1
@jeffm to mnie pomyliło. widziałem to jako foreach PHP.
tipu
79

Dla Python 3.x iteritemszostał usunięty. Zamiast tego używaj przedmiotów .

for field, possible_values in fields.items():
    print(field, possible_values)
Meistro
źródło
37

Chcesz użyć iteritems . Zwraca iterator nad słownikiem, który daje krotkę (klucz, wartość)

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

Problem polegał na tym, że zapętlałeś pola, które zwracają klucze słownika.

>>> for field in fields:
...     print field
... 
first_names
last_name
Mike Lewis
źródło
9

W przypadku list użyj enumerate

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

iteritems nie będzie działać dla obiektów listy

Jordania
źródło
To powinna być poprawna odpowiedź (przetestowana) przynajmniej dla Pythona 2.7.
Dung
1

W Python3 iteritems()nie jest już obsługiwany

ROZWIĄZANIE 1 :

Posługiwać się .items

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

ROZWIĄZANIE 2 :

Można użyć enumerate()także

for field, possible_values in enumerate(fields):
    print(field, possible_values)
ishandutta2007
źródło
0

Nie można iterować bezpośrednio w słowniku. Możesz to zrobić poprzez konwersję na krotkę .

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
źródło
Proszę wyjaśnić swoją odpowiedź.
Maciej Jureczko
Nie można iterować bezpośrednio w słowniku. Możesz to zrobić poprzez konwersję na krotkę.
satya narayan pardhi
0

brakuje ci fields.iteritems()w kodzie.

Możesz to również zrobić w inny sposób, uzyskując wartości za pomocą kluczy w słowniku.

for key in fields:
    value = fields[key]
Vaibhav Desai
źródło
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
źródło
4
Witamy w Stack Overflow! Zasadniczo odpowiedzi są o wiele bardziej pomocne, jeśli zawierają wyjaśnienie tego, do czego służy kod i dlaczego rozwiązuje problem bez przedstawiania innych.
Tim Diekmann