将列表解包到元组中间

11

我有一个大小不确定的列表:

l = [...]

我希望能够将这个列表解包成一个具有其他值的元组,但以下代码会失败:

t = ("AA", "B", *l, "C")

我该如何构造以下内容?
t = ("AA", "B", l[0], ..., l[:-1], "C")

编辑:仅对切片[a:b]进行操作也很好:

t = ("AA", "B", l[a], ..., l[b], "C")
3个回答

10

从Python 3.5开始,您现在可以使用第一种方法:

>>> l = [1, 2, 3]
>>> t = ("AA", "B", *l, "C")
>>> t
('AA', 'B', 1, 2, 3, 'C')

您可以像预期的那样使用切片:

>>> ("AA", "B", *l[:-1], "C")
('AA', 'B', 1, 2, 'C')

相关的 PEP 参考链接: PEP448

9

你不能像那样替换值来将其解包为元组(目前还不行-请参见PEP 448),因为解包只会发生在左手边的表达式或者如错误信息所说的赋值目标上。

此外,赋值目标应该有有效的Python变量。在你的情况下,元组中也有字符串字面值。

但是你可以通过连接三个元组来构造你想要的元组,就像这样:

>>> l = [1, 2, 3, 4]
>>> ("A", "B") + tuple(l[:-1]) + ("C",)
('A', 'B', 1, 2, 3, 'C')
>>> ("A", "B") + tuple(l) + ("C",)
('A', 'B', 1, 2, 3, 4, 'C')

这个按预期工作,谢谢,虽然我认为应该支持*符号作为语法糖,因为这很丑陋。我想我可以编写一个函数来实现它。 - Tommy

0
你可以将列表展平,然后转换为元组。
>>> import itertools
>>> l=[1,2,3,4]
>>> t = ('A', 'B', l, 'C')
>>> t
('A', 'B', [1, 2, 3, 4], 'C')
>>> tuple(itertools.chain.from_iterable(t))
('A', 'B', 1, 2, 3, 4, 'C')
>>>

当列表包含像“abc”这样的多个字符项时,这种方法将无法正常工作。 - Tommy
没错,那是正确的行为。列表和字符串都是可迭代的。因此,字符串也会像列表一样被展开。我的错误。 - shantanoo

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