【问题标题】:Convert a split string to a tuple results in "too many values to unpack"将拆分字符串转换为元组会导致“太多值无法解包”
【发布时间】:2013-05-13 06:38:21
【问题描述】:

在 for 循环中使用 split 会导致上述异常。但是当从 for 循环中获取独立的元素时,它可以工作:

>>> for k,v in x.split("="):
...   print k,v
... 
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: too many values to unpack
>>> y =  x.split("=")
>>> y
['abc', 'asflskfjla']
>>> k,v = y
>>> k
'abc'
>>> v
'asflskfjla'

我们将不胜感激——当然还有 for 循环版本的正确语法。

【问题讨论】:

    标签: python string for-loop split iterable-unpacking


    【解决方案1】:

    for 循环期望可迭代对象中的每个项目都可以解压缩为两个变量。所以在你的情况下,它看起来像以下之一:

    [('a, b'), ('c, d'), ...]
    [['a, b'], ['c, d'], ...]
    ['ab', 'cd', ...]
    ...
    

    每个可迭代项中的每个项目都可以拆分为kv 组件。在你的情况下,他们不能,因为x.split('=') 的输出是一个包含两个以上字符的字符串列表:

    ['abc', 'asflskfjla']
    

    【讨论】:

    • 我不会说二元组——也许是长度为 2 的序列(尽管这样可能还不够好......)
    • @mgilson:我必须研究这个术语。像这样?
    • 是的。我认为这和你能做到的一样好。 (产生 2 个项目的生成器也可以工作,所以这打破了我对序列的术语)。
    【解决方案2】:

    x.split 返回一个字符串列表,您可以从 y 变量中看到。当您对其进行迭代时,它会获取列表'abc' 的第一个元素并尝试将其绑定到元组k, v。由于字符串是一种序列类型,它会尝试将字符串的字符分配给您要求的元组 - 实际上有太多值(三个字母)无法解压缩成一个二元素元组。

    【讨论】:

      【解决方案3】:

      如果您想要这种行为,只需将 s.split() 包装在一个列表中:

      >>> for (k,v) in [s.split("=")]:
          print(k,v)  
      ('abc', 'asflskfjla')
      

      【讨论】:

        猜你喜欢
        • 2021-12-06
        • 2021-01-13
        • 1970-01-01
        • 2014-08-16
        • 2017-08-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多