【问题标题】:Python ValueError: too many values to unpack [duplicate]Python ValueError:解包的值太多[重复]
【发布时间】:2011-08-13 21:59:39
【问题描述】:

我从这段代码中得到了这个异常:

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 行是引发异常的行。 ms 是 Material 对象。有人知道为什么吗?

【问题讨论】:

    标签: python


    【解决方案1】:

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

    由于self.materials 有两个以上的key*,它们无法解包到tuplek, m”中,因此引发了ValueError exception

    在 Python 2.x 中,为了迭代键和值(tuple "k, m"),我们使用 self.materials.iteritems()

    但是,既然您无论如何都要把密钥扔掉,那么您也可以简单地遍历字典的值:

    for m in self.materials.itervalues():
    

    在 Python 3.x 中,首选dict.values()(返回dictionary view object):

    for m in self.materials.values():
    

    【讨论】:

    • 我没弄到这里的东西,你为什么说它有两个以上的键?
    • @NunoFurtado:2.5 年后,我只能猜测年轻的自己的推理。开始! self.materials 中是否有零个或一个键,我希望 ValueError 消息是 need more than n values to unpack。如果恰好有两个键,它们将被解压缩到 km 中(并且可能会在下一行出现不同的错误)。三个或更多键? ValueError: too many values to unpack,根据标题。
    • 大声笑,甚至没有注意到帖子的年龄。我遇到了类似的问题,我只是不明白为什么会发生该错误,但我还是使用了您的解决方案来解决问题
    【解决方案2】:
    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))
    

    【讨论】:

      【解决方案3】:

      对字典对象本身进行迭代实际上会为您提供一个对其 的迭代器。 Python 正在尝试将您从 m.type + m.purity 获得的密钥解包到 (m, k) 中。

      我的水晶球说m.typem.purity 都是弦,所以你的钥匙也是弦。字符串是可迭代的,因此可以解包;但是遍历字符串会给你一个遍历其字符的迭代器。因此,每当m.type + m.purity 的长度超过两个字符时,您就有太多的值需要解压。 (而且只要它更短,您就可以解压缩的值太少了。)

      要解决此问题,您可以显式迭代字典的 items,它们是您似乎期望的 (key, value) 对。但是,如果您只想要这些值,那么只需使用这些值。

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

      【讨论】:

      • 谢谢。在更新 { 'longkey_n' : [ 'value_1', 'value_n' ] } :-D 形式的字典时,您的提示帮助我解决了我的问题。我的程序还抱怨值太多...
      猜你喜欢
      • 2019-08-30
      • 1970-01-01
      • 2014-01-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-15
      • 2019-08-26
      相关资源
      最近更新 更多