Python ValueError:要解压缩的值太多

时间:2011-08-13 21:59:39

标签: 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

for行是抛出异常的行。 mMaterial个对象。有人有什么想法吗?

3 个答案:

答案 0 :(得分:166)

self.materialsdict,默认情况下,您只是遍历键(字符串)。

由于self.materials有两个以上的密钥*,因此无法将其解压缩到tuplek, m”,因此ValueError {{ 3}}被提出。

在Python 2. x 中,为了迭代键和值(exceptionk, 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.typem.purity都是字符串,所以你的钥匙也是字符串。字符串是可迭代的,因此可以解压缩;但迭代字符串会为你的字符提供一个迭代器。因此,只要m.type + m.purity长度超过两个字符,就会有太多值无法解压缩。 (而且只要它更短,你就没有太少的值来解包。)

要解决这个问题,你可以在dict的items上显式迭代,这是你似乎期待的(键,值)对。但是,如果您只想要这些值,那么只需使用这些值。

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