Python ValueError:要取消固定的值太多

2024-04-19 10:06:02 发布

您现在位置: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对象。有人知道为什么吗?


Tags: 代码selfaddforinitdeftypeserialize
3条回答
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))

self.materials是一个^{},默认情况下,您只迭代键(字符串)。

由于self.materials有两个以上的键*,因此无法将它们解压缩到^{}k, m”中,因此^{}exception被引发。

在Python 2.x中,为了迭代键和值(即^{}k, m”),我们使用^{}

但是,由于您无论如何都要扔掉密钥,您也可以简单地迭代字典的值:

for m in self.materials.itervalues():

在Python 3.x中,首选^{}(返回dictionary view object):

for m in self.materials.values():

遍历dictionary对象本身实际上给了您一个遍历其的迭代器。Python正在尝试将密钥解包,从m.type + m.purity将密钥解包到(m, k)

我的水晶球说m.typem.purity都是字符串,所以你的键也是字符串。字符串是可iterable的,因此可以对其进行解包;但是对字符串进行迭代会给您提供对其字符的迭代器。因此,每当m.type + m.purity超过两个字符时,就有太多的值要解包。(而且,当它较短时,您的值太少,无法解包。)

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

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

相关问题 更多 >