Python 拆分方法:避免“没有足够的值来解压缩”错误

python split method: avoiding the "not enough values to unpack" error

提问人:kitelooper 提问时间:11/18/2023 更新时间:11/18/2023 访问量:58

问:

在 python 中使用 split 方法时,如果没有分配完全正确的值数,它会失败并显示以下错误:

ValueError:没有足够的值来解压缩(预期为 4,得到 3)

在这个简单的例子中,当一个变量没有 4 个值时,我如何在它的位置分配一个空变量?我能想到的最好的解决方案是计算逗号的数量(分隔符),然后根据数字使用不同的拆分语句,但必须有更好的方法。在 perl 中使用 split 的行为会有所不同,如果您编写了与下面相同的 perl 代码,并且如果第 4 个值不存在,它会自动将“undef”分配给 col4,而不会导致程序崩溃。我想在python中做等效的事情。

colors = ['blue, purple, red',
          'black, brown',
          'orange',
          'pink, white, yellow']

for x in colors:
    (col1, col2, col3, col4) = x.split(',')
python-3.x 拆分

评论

1赞 Malcolm 11/18/2023
拆分为单个列表变量,然后您可以用 None 和 填充。Perl 使许多变量神奇地出现,这可能会导致许多难以发现的错误。真正的问题是,为什么你需要四个固定名称变量,而你可以让你的代码处理列表,无论它的长度是多少。color_list = x.split(',')while len(color_list) < 4: color_list.append(None)
1赞 Tim Roberts 11/18/2023
每当您发现自己有名为 、 等的变量时,对于任何 ,您都需要用列表(或其他数据结构)替换这些变量。它很短,更灵活,而且不易出错。xxx1xxx2xxx3xxx
0赞 juanpa.arrivillaga 11/18/2023
只需将其保留为列表即可。
0赞 kitelooper 11/21/2023
在我最初的问题中,我尽可能地缩短和简化了代码。这样做的目的是我有一个包含 4 列的表,我需要在每列中添加一个变量,当一个变量不存在时,只需将其留空。我最终做了一些与@Malcom建议类似的事情。我检查列表的长度,如果不是 4,我创建空白变量。我希望有一种自动方法可以像在perl中一样在一行中执行此操作 = (col1, col2, col3, col4) = split(',', $var)

答:

1赞 erny 11/18/2023 #1

只需添加“,,,”即可获得前 4 个元素,例如:

colors = ['blue, purple, red',
          'black, brown',
          'orange',
          'pink, white, yellow']

for x in colors:
    (col1, col2, col3, col4) = (x + ',,,').split(',')[:4]

评论

0赞 kitelooper 11/21/2023
这太棒了,谢谢@erny!
2赞 Goku - stands with Palestine 11/18/2023 #2

更好的方法是将其拆分为一个列表,然后检查每个子列表的长度,如@Malcolm所说:

for x in colors:
    print(x.split(', '))

['blue', 'purple', 'red']
['black', 'brown']
['orange']
['pink', 'white', 'yellow']

如果你想解包列表,但你不知道元素的数量,那么你也可以使用解包运算符:*

colors = ['blue, purple, red',
          'black, brown',
          'orange',
          'pink, white, yellow']

for x in colors:
    a,*b = x.split(', ')
    print(a,b)

#output

blue ['purple', 'red']
black ['brown']
orange []
pink ['white', 'yellow']

列表的第一个元素将始终位于 a 中,其余元素将存在于 b 中。 它也适用于空列表。如果没有第二个元素,b 将是一个空列表。

1赞 Terry Spotts 11/18/2023 #3

您可以将创建的列表传递到一个自定义函数中,该函数将始终生成 4 个值(默认为 ):split()None

def unpack4(seq):
    it = iter(seq)
    for _ in range(4):
        yield next(it, None)


colors = ["orange",
          "black,brown",
          "blue,purple,red",
          "pink,white,yellow,cyan",
          "green,violet,indigo,maroon,aqua",
          ]

for c in colors:
    (col1, col2, col3, col4) = unpack4(c.split(","))
    print(col1, col2, col3, col4)

输出:

orange None None None
black brown None None
blue purple red None
pink white yellow cyan
green violet indigo maroon

请注意,在第 5 个示例中缺少 aqua,这不会涵盖空字符串的情况 “”
但正如其他人所评论的那样,这似乎是一种糟糕的编程实践......