我从这段代码中得到了这个例外:
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
行是抛出异常的行。 m
是Material
个对象。有人有什么想法吗?
答案 0 :(得分:166)
self.materials
是dict
,默认情况下,您只是遍历键(字符串)。
由于self.materials
有两个以上的密钥*,因此无法将其解压缩到tuple
“k, m
”,因此ValueError
{{ 3}}被提出。
在Python 2. x 中,为了迭代键和值(exception“k, m
”),我们使用tuple
。
然而,既然你无论如何都要丢掉钥匙,你也可以简单地迭代字典的值:
for m in self.materials.itervalues():
在Python 3. x 中,首选self.materials.iteritems()
(返回dict.values()
):
for m in self.materials.values():
答案 1 :(得分:64)
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))
答案 2 :(得分:18)
迭代字典对象本身实际上会为你的键提供一个迭代器。 Python正在尝试解压缩密钥,您可以将密钥从m.type + m.purity
解压缩到(m, k)
。
我的水晶球说m.type
和m.purity
都是字符串,所以你的钥匙也是字符串。字符串是可迭代的,因此可以解压缩;但迭代字符串会为你的字符提供一个迭代器。因此,只要m.type + m.purity
长度超过两个字符,就会有太多值无法解压缩。 (而且只要它更短,你就没有太少的值来解包。)
要解决这个问题,你可以在dict的items
上显式迭代,这是你似乎期待的(键,值)对。但是,如果您只想要这些值,那么只需使用这些值。
(在2.x,itervalues
,iterkeys
和iteritems
通常是更好的主意;非iter
版本会创建一个包含值的新列表对象/ keys / items。对于迭代中的大型词典和繁琐的任务,这可能比仅设置迭代器的iter
版本慢得多。)