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的行。 这些mMaterial对象。 任何人有任何想法,为什么?

self.materials是一个dict ,默认情况下,你只是遍历键(这是string)。

由于self.materials有两个以上的键* ,所以它们不能被解压到tuplek, m ”中,因此会引发ValueError exception 。

在Python self.materials.iteritems() ,为了遍历键和值( tuplek, 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.puritym.type + m.purity获得的m.type + m.purity(m, k)

我的水晶球说m.typem.purity都是string,所以你的键也是string。 string是可迭代的,所以它们可以被解压缩; 但迭代string会给你一个迭代器来处理它的字符。 所以每当m.type + m.purity的长度超过两个字符时,就有太多的值需要解压。 (而且,每当它更短时,你的解包值就太less了。

为了解决这个问题,你可以明确地迭代字典中的items ,这些items是你似乎期望的(键,值)对。 但是,如果您只需要这些值,那么只需使用这些值即可。

(在2.x中, itervaluesiterkeysiteritems通常是一个更好的主意;非iter版本创build一个包含values / keys / items的新列表对象,对于迭代中的大型词典和琐碎的任务,这可以是比仅仅设置一个迭代器的iter版本慢很多)。