解压包含列表的元组列表

4

我有一个元组列表,其中一个元素是列表。

example = [([0, 1, 2], 3, 4), ([5, 6, 7], 8, 9)]

我希望最终只得到一个元组列表。
output = [(0, 1, 2, 3, 4), (5, 6, 7, 8, 9)]

这个问题似乎解决了元组的问题,但我很担心因为我的用例在内部列表中有更多的元素。

[(a, b, c, d, e) for [a, b, c], d, e in example]

看起来很繁琐。有更好的写法吗?


你的所有元组是否完全匹配 ([a, b, c], d, e) 模式? - ereOn
是的。我实际上有一个包含100个元素的列表,但这100个元素都是相同的,并且它们总是在外部具有2个元素。 - o-90
3
如果列表中的所有元组都符合模式([a, b, c], d, e),那么你的代码就是Pythonic的,看起来并不冗长。 - user1823
元组中列表的位置是否可以更改,还是固定的? - ereOn
元组中的列表始终将是第零个。 - o-90
3个回答

5
元组可以像列表一样使用+进行连接。因此,您可以执行以下操作:
>>> example = [([0, 1, 2], 3, 4), ([5, 6, 7], 8, 9)]
>>> [tuple(x[0]) + x[1:] for x in example]
[(0, 1, 2, 3, 4), (5, 6, 7, 8, 9)]

请注意,这适用于Python 2.x和3.x。

4
在Python3中,你也可以这样做:
[tuple(i+j) for i, *j in x]

如果您不想拼写输入的每个部分,可以这样做。

我喜欢它!能否解释一下对于像我这样仍然停留在Python 2.x的可怜家伙究竟会发生什么? - ereOn
Python2.x中出现*jSyntaxError: invalid syntax错误。 - wflynny

2
如果编写一个函数是一个选项:
from itertools import chain

def to_iterable(x):
    try:
        return iter(x)
    except TypeError:
        return x,

example = [([0, 1, 2], 3, 4), ([5, 6, 7], 8, 9)]
output = [tuple(chain(*map(to_iterable, item))) for item in example]

这将会得到:

print(output)
[(0, 1, 2, 3, 4), (5, 6, 7, 8, 9)]

这种方法比其他解决方案更冗长,但具有一个很好的优点:无论内部元组中列表的位置或数量如何,都可以正常工作。根据您的要求,这可能是过度设计或是一个好的解决方案。


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