【问题标题】:Unpack value(s) into variable(s) or None (ValueError: not enough values to unpack) [duplicate]将值解包到变量或无(ValueError:没有足够的值来解包)[重复]
【发布时间】:2019-12-12 11:09:07
【问题描述】:

如何将iterable 解压缩到数量不匹配的变量中?

值太多:

>>> one,two = [1,2,3]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: too many values to unpack (expected 2)

可以忽略

>>> one,two,*_ = [1,2,3,4]  
>>> 

注意:“extended iterable unpacking”仅从 Python 3 开始。关于underscore

数据太少/变量多的相反情况怎么办:

>>> one,two,three = [1,2]   
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: not enough values to unpack (expected 3, got 2)
>>>

进行处理,特别是为剩余的变量分配None(或其他值)?

类似这样的:

>>> one,two,three = [1,2] or None
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: not enough values to unpack (expected 3, got 2)
>>>


https://stackoverflow.com/a/8857846/1619432 建议扩展列表:
>>> one,two,three = [1,2] + [None]*(3-2)
>>> one   
1
>>> two
2
>>> three
>>>

【问题讨论】:

  • 您是否正在寻找一个更通用的答案,即左侧也可以包含三个以上的变量?
  • @DeveshKumarSingh 是的。不过,数字变量是恒定的。
  • 那我觉得不可能实现

标签: python iterable-unpacking


【解决方案1】:

您可以使用以下方法将一个序列解压缩为三个变量:

one, two, *three = [1,2]

此时,three 将是一个空列表。然后,您可以使用 or 检查三个是否为空,将 three 分配给 None

three = three or None

【讨论】:

  • 我认为他正在寻找一个更一般的答案,其中左边的变量数可以是大于或等于3的任何数量
【解决方案2】:

这对你有用吗?您可以根据需要将nones 数组设置为任意大小。

nones = [None]*100 # or however many you think you might need
one, two, three, four, five, *_ = [1,2] + nones

【讨论】:

    【解决方案3】:

    使用* 运算符并使用您正在解包的内容填充中间可迭代对象,并使用您选择的默认值填充其余部分。

    x = [1, 2]
    default_value= None
    one, two, three = [*x, *([default_value] * (3 - len(x)))]
    

    还有一个处理这两种情况的奖励函数:

    def unpack(source, target, default_value=None):
        n = len(source)
        if n < target:
            return [*source, *([default_value] * (target - len(source)))]
        elif n > target:
            return source[0:target]
        else:
            return source
    

    根据需要修改以处理不可迭代的输入。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-01-26
      • 2017-12-29
      • 2021-04-11
      • 1970-01-01
      • 2023-02-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多