如何在Python中合并任意数量的元组?

8

我有一个元组列表:

l=[(1,2,3),(4,5,6)]

列表和元组的长度可以是任意的。我想把它转换成一个列表或元组,其中包含它们出现的顺序。
f=[1,2,3,4,5,6] # or (1,2,3,4,5,6)

如果我在开发时知道会返回多少个元组,我可以直接将它们添加:

m = l[0] + l[1]  # (1,2,3,4,5,6)

但是由于在运行时我不知道会有多少元组,所以我不能这样做。我觉得有一种方法可以使用map来完成,但我想不出来。我可以遍历元组并将它们添加到累加器中,但那会创建很多永远不会使用的中间元组。我也可以遍历元组,然后遍历元组的元素,并将它们附加到列表中。这似乎非常低效。也许还有一种更简单的方法,但我完全忽略了。有什么想法吗?
7个回答

21

Chain它们(仅创建一个生成器而不是保留额外的内存):


>>> from itertools import chain
>>> l = [(1,2,3),(4,5,6)]
>>> list(chain.from_iterable(l))
[1, 2, 3, 4, 5, 6]

我知道肯定有一种使用itertools的方法可以做到,但是我就是找不到。已接受。 - technomalogical

10
l = [(1, 2), (3, 4), (5, 6)]
print sum(l, ()) # (1, 2, 3, 4, 5, 6)

当我这样滥用sum时,我总是感到很糟糕。但这并没有阻止它在我的脑海中出现。 - Zach Kelling
() 作为 start 值代表什么?是空元组吗?这是如何工作的?! - Zach Young
@DSM:是的,链式编程更好。但是,另一种解决方案总是很不错的。 - Cat Plus Plus
+1 简洁明了,但是我接受链式答案作为最有效的方法来完成这个。 - technomalogical
@ZacharyYoung:我不得不自己查一下。如果序列为空,则 sum 将返回 0 而不是 ()start =() 将一个空元组添加到最后一个元组中(结果不发生变化),或者如果序列为空,则仅返回该空元组。 - technomalogical
显示剩余2条评论

2
reduce(tuple.__add__, [(1,2,3),(4,5,6)])

2
tuple(i for x in l for i in x) # (1, 2, 3, 4, 5, 6)

2

对于以下所有内容,请使用Pythonic生成器风格:

b=[(1,2,3),(4,5,6)]

list = [ x for x in i for i in b ] #produces a list
gen = ( x for x in i for i in b ) #produces a generator
tup = tuple( x for x in i for i in b ) #produces a tuple

print list
>> [1, 2, 3, 4, 5, 6]

1
我刚在数据结构教程中找到这个链接:http://docs.python.org/tutorial/datastructures.html#list-comprehensions。给一个好例子点赞! - technomalogical

0
>>> from itertools import chain
>>> l = [(1,2,3),(4,5,6)]
>>> list(chain(*l))
[1, 2, 3, 4, 5, 6]

0
您可以使用 .extend() 函数将列表中的值组合起来,如下所示:
l = [(1,2,3), (4,5,6)]
m = []
for t in l:
    m.extend(t)

或者使用 reduce 函数来缩短代码:

l = [(1,2,3), (4,5,6)]
m = reduce(lambda x,y: x+list(y), l, [])

1
列表有.extend(iterable)方法。不需要从t创建新的列表。 - AndiDog
@MattAlcock 所有未绑定的列表对象都将由垃圾回收器清理,对吗?如果我没有正确理解你的问题,很抱歉。 - wobmene
@AndiDog 谢谢,我不知道有 list.extend(iterable) 这个方法,使用 .extend 应该从任何角度来看都更好。 - wobmene

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