Python的ValueError:太多的值来解压缩
我从这个代码得到这个exception:
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
for
行是抛出exception的行。 这些m
是Material
对象。 任何人有任何想法,为什么?
self.materials
是一个dict
,默认情况下,你只是遍历键(这是string)。
由于self.materials
有两个以上的键* ,所以它们不能被解压到tuple
“ k, m
”中,因此会引发ValueError
exception 。
在Python self.materials.iteritems()
,为了遍历键和值( tuple
“ k, m
”),我们使用self.materials.iteritems()
。
然而,既然你把键扔掉了,你也可以迭代字典的值:
for m in self.materials.itervalues():
在Python dict.values()
,更喜欢dict.values()
(它返回一个字典视图对象 ):
for m in self.materials.values():
for k, m in self.materials.items():
例:
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))
迭代一个字典对象本身实际上给了你一个迭代器,通过它的键 。 Python正在试图m.type + m.purity
从m.type + m.purity
获得的m.type + m.purity
到(m, k)
。
我的水晶球说m.type
和m.purity
都是string,所以你的键也是string。 string是可迭代的,所以它们可以被解压缩; 但迭代string会给你一个迭代器来处理它的字符。 所以每当m.type + m.purity
的长度超过两个字符时,就有太多的值需要解压。 (而且,每当它更短时,你的解包值就太less了。
为了解决这个问题,你可以明确地迭代字典中的items
,这些items
是你似乎期望的(键,值)对。 但是,如果您只需要这些值,那么只需使用这些值即可。
(在2.x中, itervalues
, iterkeys
和iteritems
通常是一个更好的主意;非iter
版本创build一个包含values / keys / items的新列表对象,对于迭代中的大型词典和琐碎的任务,这可以是比仅仅设置一个迭代器的iter
版本慢很多)。