'demasiados valores para descomprimir', iterando sobre un dict. clave => cadena, valor => lista


323

Estoy recibiendo el 'too many values to unpack'error ¿Alguna idea de cómo puedo solucionar esto?

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              

Respuestas:


478

Python 2

Necesitas usar algo como iteritems.

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

Consulte esta respuesta para obtener más información sobre la iteración a través de diccionarios, como el uso items(), en todas las versiones de Python.

Python 3

Desde Python 3 iteritems() está ya no es compatible . Usar en su items()lugar.

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

88
En cuanto a por qué necesita hacer esto, iterar sobre un diccionario recorre las claves, no los pares clave / valor.
Jeff Mercado

1
@jeffm eso es lo que me confundió. Vi esto como un foreach PHP.
tipu

79

Para Python 3.x iteritemsse ha eliminado. Use artículos en su lugar.

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

37

Desea usar iteritems . Esto devuelve un iterador sobre el diccionario, que le da una tupla (clave, valor)

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

Su problema fue que estaba recorriendo los campos, lo que devuelve las claves del diccionario.

>>> 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 no funcionará para objetos de lista


Esta debería ser una respuesta correcta (probada) para Python 2.7 al menos.
Estiércol

1

En Python3 iteritems()ya no es compatible

SOLUCIÓN1 :

Utilizar .items

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

SOLUCIÓN2 :

Puedes usar enumerate()también

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

0

No se puede iterar directamente en el diccionario. Para que pueda a través de la conversión en 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 su respuesta.
Maciej Jureczko

No se puede iterar directamente en el diccionario. Para que pueda a través de la conversión en tupla.
satya narayan pardhi

0

Te falta fields.iteritems()tu código.

También podría hacerlo de otra manera, donde obtiene valores utilizando claves en el diccionario.

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)

44
¡Bienvenido a Stack Overflow! En general, las respuestas son mucho más útiles si incluyen una explicación de lo que se pretende que haga el código y por qué eso resuelve el problema sin introducir otros.
Tim Diekmann
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.