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做到这一点,但我无法弄清楚。我可以遍历元组并将它们添加到累加器中,但这会创建许多永远不会使用的中间元组。我还可以遍历元组,然后遍历元组的元素,并将它们附加到列表中。这似乎非常低效。也许有一个更简单的方法,我完全掩饰了。有什么想法吗?

4

7 回答 7

19

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

>>> from itertools import chain
>>> l = [(1,2,3),(4,5,6)]
>>> list(chain.from_iterable(l))
[1, 2, 3, 4, 5, 6]
于 2012-02-22T19:03:41.120 回答
9
l = [(1, 2), (3, 4), (5, 6)]
print sum(l, ()) # (1, 2, 3, 4, 5, 6)
于 2012-02-22T19:02:05.480 回答
2
reduce(tuple.__add__, [(1,2,3),(4,5,6)])
于 2012-02-22T19:02:38.693 回答
2
tuple(i for x in l for i in x) # (1, 2, 3, 4, 5, 6)
于 2012-02-22T19:11:38.023 回答
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]
于 2012-02-22T19:51:01.997 回答
0
>>> from itertools import chain
>>> l = [(1,2,3),(4,5,6)]
>>> list(chain(*l))
[1, 2, 3, 4, 5, 6]
于 2012-02-22T19:43:18.567 回答
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, [])
于 2012-02-22T20:35:38.093 回答