«trop de valeurs à déballer», itérant sur un dict. clé => chaîne, valeur => liste

323

Je reçois l' 'too many values to unpack'erreur. Une idée de comment résoudre ce problème?

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
la source

Réponses:

478

Python 2

Vous devez utiliser quelque chose comme iteritems.

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

Voir cette réponse pour plus d'informations sur l'itération à travers des dictionnaires, tels que l'utilisation items(), à travers les versions de python.

Python 3

Depuis Python 3 iteritems() est plus pris en charge . Utilisez items()plutôt.

for field, possible_values in fields.items():
    print(field, possible_values)
Philip Southam
la source
88
Quant à savoir pourquoi vous devez le faire, itérer sur un dictionnaire itère à travers les clés, pas les paires clé / valeur.
Jeff Mercado
1
@jeffm c'est ce qui m'a dérouté. j'ai vu cela comme un foreach PHP.
tipu
79

Pour Python 3.x iteritemsa été supprimé. Utilisez plutôt des objets .

for field, possible_values in fields.items():
    print(field, possible_values)
Meistro
la source
37

Vous souhaitez utiliser des itérations . Cela renvoie un itérateur sur le dictionnaire, qui vous donne un tuple (clé, valeur)

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

Votre problème était que vous faisiez une boucle sur les champs, ce qui renvoie les clés du dictionnaire.

>>> for field in fields:
...     print field
... 
first_names
last_name
Mike Lewis
la source
9

Pour les listes, utilisez enumerate

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

iteritems ne fonctionnera pas pour les objets de liste

Jordan
la source
Cela devrait être une réponse correcte (testée) pour python 2.7 au moins.
Dung
1

En Python3 iteritems()n'est plus pris en charge

SOLUTION1 :

Utilisation .items

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

SOLUTION2 :

Vous pouvez utiliser enumerate()aussi bien

for field, possible_values in enumerate(fields):
    print(field, possible_values)
ishandutta2007
la source
0

Impossible d'itérer directement dans le dictionnaire. Ainsi, vous pouvez le convertir en tuple .

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
la source
Veuillez expliquer votre réponse.
Maciej Jureczko
Impossible d'itérer directement dans le dictionnaire. Ainsi, vous pouvez le convertir en tuple.
satya narayan pardhi
0

vous manquez fields.iteritems()dans votre code.

Vous pouvez également le faire d'une autre manière, où vous obtenez des valeurs en utilisant des clés dans le dictionnaire.

for key in fields:
    value = fields[key]
Vaibhav Desai
la source
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
la source
4
Bienvenue dans Stack Overflow! Généralement, les réponses sont beaucoup plus utiles si elles incluent une explication de ce que le code est censé faire et pourquoi cela résout le problème sans en introduire d'autres.
Tim Diekmann