提问人:kitelooper 提问时间:11/18/2023 更新时间:11/18/2023 访问量:58
Python 拆分方法:避免“没有足够的值来解压缩”错误
python split method: avoiding the "not enough values to unpack" error
问:
在 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(',')
答:
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
,这不会涵盖空字符串的情况 “”
但正如其他人所评论的那样,这似乎是一种糟糕的编程实践......
评论
color_list = x.split(',')
while len(color_list) < 4: color_list.append(None)
xxx1
xxx2
xxx3
xxx