«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              

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)

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)

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

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


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)

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)

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]

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
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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.