将元组的部分解包为元组

4
我有一个类似这样的元组:
t = (1, '0076', 'AU', '9927016803A', '9927013903B', '0010', 'VO')

我希望提取前6个值作为元组(按顺序),并将最后一个值作为字符串。以下代码已经可行,但我想知道是否有一种“一行代码”的方法来实现我想要的结果。
# works, but it's not nice to unpack each value individually
cid,sc,ma,comp,mat,step,alt = t 
t_new = (cid,sc,ma,comp,mat,step,)
print(t_new, alt) # (1, '0076', 'AU', '9927016803A', '9927013903B', '0010') VO

这非常接近我要找的东西,但它返回的第一个值是列表而不是元组:

# works, but returns list
*t_new,alt = t 
print(t_new, alt) # [1, '0076', 'AU', '9927016803A', '9927013903B', '0010'] VO

我已经尝试了以下方法,但都没有成功:

tuple(*t_new),alt = t # SyntaxError
(*t_new),alt = t # still a list
(*t_new,),alt = t # ValueError

如果没有其他办法,我可能会选择第二种方法,将列表转换为元组。
3个回答

7
为什么不直接这样做:
t = (1, '0076', 'AU', '9927016803A', '9927013903B', '0010', 'VO')

t_new, alt = t[:-1], t[-1]
print(t_new, alt)   # (1, '0076', 'AU', '9927016803A', '9927013903B', '0010') VO

1
我从未意识到我可以像切列表一样切元组。这就是我在寻找的一行代码。 - Mike Scotty

3

你可以像你说的那样,将它再次转换为元组:

*t_new, alt = t
t_new = tuple(t_new)

或者直接使用切片:

t_new = t[:-1]  # Will be a tuple
alt = t[-1]

如果您想谈论效率,与切片相比,元组的打包/解包速度相对较慢,因此最后一个应该是最快的。


1
如果您希望在新元组中始终拥有前6个值:
t = (1, '0076', 'AU', '9927016803A', '9927013903B', '0010', 'VO')
newT = t[0:6]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接