我从这段代码中得到了这个例外:
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
Run Code Online (Sandbox Code Playgroud)
该for行是抛出异常的行.该ms为Material对象.有人有什么想法吗?
Joh*_*web 174
self.materials是一个dict,默认情况下,您只是迭代键(这是字符串).
由于self.materials有两个以上的键*,它们无法解压缩到tuple" k, m"中,因此引发了异常.ValueError
在Python 2. x中,我们使用迭代键和值(tuple" k, m")self.materials.iteritems().
但是,既然你无论如何都要扔钥匙,你也可以简单地迭代字典的值:
for m in self.materials.itervalues():
Run Code Online (Sandbox Code Playgroud)
在Python 3. x中,prefer dict.values()(返回字典视图对象):
for m in self.materials.values():
Run Code Online (Sandbox Code Playgroud)
Sun*_* Jo 67
for k, m in self.materials.items():
Run Code Online (Sandbox Code Playgroud)
例:
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))
Run Code Online (Sandbox Code Playgroud)
Kar*_*ome 18
遍历Dictionary对象本身实际上让你在它的迭代器按键.Python是试图解压键,你从获取m.type + m.purity到(m, k).
我的水晶球说m.type并且m.purity都是弦,所以你的钥匙也是弦.字符串是可迭代的,因此可以解压缩; 但迭代字符串会为你的字符提供一个迭代器.因此,每当m.type + m.purity长度超过两个字符时,您需要解压缩的值太多.(而且只要它更短,你就没有太少的价值来打开包装.)
要解决这个问题,你可以items在dict上明确地迭代,这是你似乎期待的(键,值)对.但如果您只想要这些值,那么只需使用这些值即可.
(在2.x中,itervalues,iterkeys,和iteritems通常是一个更好的主意;非iter版本创建一个包含价值/按键/项新的列表对象的迭代中大型辞书和琐碎的任务,这可能是比慢了许多.iter只设置迭代器的版本.)
| 归档时间: |
|
| 查看次数: |
350347 次 |
| 最近记录: |