Python ValueError:要解压缩的值太多

Nik*_*Nik 141 python

我从这段代码中得到了这个例外:

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)

  • @NunoFurtado:2.5年后,我只能猜测我年轻的自我推理.开始!如果在`self.materials`中有零个或一个键,我希望``ValueError`消息"需要多于n个值才能解压缩".如果只有两个键,这些键将被解压缩为`k`和`​​m`(并且可能在下一行会出现不同的错误).三个或更多键?根据标题,"ValueError:解压缩的值太多了". (9认同)

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只设置迭代器的版本.)