'valores demais para descompactar', repetindo um ditado. chave => sequência, valor => lista


323

Estou recebendo o 'too many values to unpack'erro. Alguma idéia de como eu posso consertar isso?

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              

Respostas:


478

Python 2

Você precisa usar algo como iteritems.

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

Consulte esta resposta para obter mais informações sobre a iteração através de dicionários, como o uso items(), nas versões python.

Python 3

Como o Python 3 nãoiteritems() é mais suportado . Use em items()vez disso.

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

88
Quanto ao motivo pelo qual você precisa fazer isso, a iteração em um dicionário itera pelas chaves, não pelos pares chave / valor.
Jeff Mercado

1
@jeffm é isso que me confundiu. eu vi isso como um foreach PHP.
tipu

79

Para Python 3.x iteritemsfoi removido. Use itens em seu lugar.

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

37

Você deseja usar itens . Isso retorna um iterador sobre o dicionário, que fornece uma tupla (chave, valor)

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

Seu problema era que você estava fazendo um loop sobre os campos, que retornam as chaves do dicionário.

>>> for field in fields:
...     print field
... 
first_names
last_name

9

Para listas, use enumerate

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

iteritems não funcionará para objetos de lista


Esta deve ser uma resposta correta (testada) para o python 2.7, pelo menos.
Dung

1

No Python3 iteritems()não é mais suportado

SOLUÇÃO1 :

Usar .items

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

SOLUÇÃO2 :

Você pode usar enumerate()também

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

0

Não pode ser iterado diretamente no dicionário. Assim, você pode converter em tupla .

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)

Por favor, explique sua resposta.
Maciej Jureczko

Não pode ser iterado diretamente no dicionário. Assim, você pode converter em tupla.
Satya narayan pardhi 19/10/19

0

você está ausente fields.iteritems()no seu código.

Você também pode fazer isso de outra maneira, onde obtém valores usando as chaves no dicionário.

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
Bem-vindo ao Stack Overflow! Geralmente, as respostas são muito mais úteis se incluirem uma explicação do que o código pretende fazer e por que isso resolve o problema sem a introdução de outros.
precisa
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.