values too many expected dict create python

too - Python ValueError: demasiados valores para descomprimir



valueerror too many values to unpack expected 3 (3)

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))