too - Python ValueError: demasiados valores para descomprimir
valueerror too many values to unpack expected 3 (3)
Esta pregunta ya tiene una respuesta aquí:
Obtengo esa excepción de este código:
class Transaction:
def __init__ (self):
self.materials = {}
def add_material (self, m):
self.materials[m.type + m.purity] = m
def serialize (self):
ser_str = ''transaction_start/n''
for k, m in self.materials:
ser_str += m.serialize ()
sert += ''transaction_end/n''
return ser_str
La línea for
es la que lanza la excepción. Los m
s son objetos Material
. Alguien tiene alguna idea de por qué?
La iteración sobre un objeto de diccionario en sí misma realmente le da un iterador sobre sus claves . Python está tratando de descomprimir las claves, que obtienes de m.type + m.purity
en (m, k)
.
Mi bola de cristal dice que m.type
y m.purity
son ambas cadenas, por lo que tus claves también son cadenas. Las cadenas son iterables, por lo que se pueden desempaquetar; pero iterar sobre la cadena le da un iterador sobre sus caracteres. Por lo tanto, siempre que m.type + m.purity
tenga más de dos caracteres de longitud, tiene demasiados valores para descomprimir. (Y cada vez que es más corto, tiene muy pocos valores para descomprimir).
Para solucionar esto, puede iterar explícitamente sobre los items
del dict, que son los pares (clave, valor) que parece estar esperando. Pero si solo quiere los valores, simplemente use los valores.
(En 2.x, itervalues
, iterkeys
y iteritems
son generalmente una mejor idea, las versiones no iter
crean un nuevo objeto de lista que contiene los valores / claves / elementos. Para diccionarios grandes y tareas triviales dentro de la iteración, esto puede ser una mucho más lento que las versiones iter
que acaban de configurar un iterador).
self.materials
es un dict
y de forma predeterminada estás iterando solo con las teclas (que son cadenas).
Como self.materials
tiene más de dos claves * , no se pueden desempaquetar en la tuple
" k, m
", por lo que se ValueError
exception ValueError
.
En Python 2. x , para iterar sobre las claves y los valores (la tuple
" k, m
"), usamos self.materials.iteritems()
.
Sin embargo, dado que está tirando la llave de todos modos, también puede simplemente iterar sobre los valores del diccionario:
for m in self.materials.itervalues():
En Python 3. x , prefiera dict.values()
(que devuelve un objeto de vista de diccionario ):
for m in self.materials.values():
for k, m in self.materials.items():
ejemplo:
miles_dict = {''Monday'':1, ''Tuesday'':2.3, ''Wednesday'':3.5, ''Thursday'':0.9}
for k, v in miles_dict.items():
print("%s: %s" % (k, v))