2011-12-12 78 views
-3
列表

可能重复:
join list of lists in python展开元组

我有这样的,其中的元组一直是相等长度的列表:

[(1, 2), (4, 7), (6, 0)] 

有什么大多数pythonic方式来产生这个?

[1, 2, 4, 7, 6, 0] 
+1

一个人怎么能与10K +推销员问这个问题,已经回答了SO已经101次? – wim

+1

@wim因为他的用户页面上有:_“语言:•Java•C•C++•HTML•CSS•PHP•Javascript”_ - >不是Python – eyquem

回答

6

可以使用list comprehension

my_list = [(1, 2), (4, 7), (6, 0)] 
result = [x for t in my_list for x in t] 

result = list(itertools.chain.from_iterable(my_list)) 
+0

事实上,我的“元组”是从对象生成的。有没有更好的方法来编写'[x for myObjects for x in(o.a,o.b)]'? – Eric

+0

@Eric:一个选择是编写一个函数'flatten()'(使用我的答案中的一个实现)并使用'flatten((o.a,o.b)for o_in my_objects')。你必须选择你最喜欢的东西。 –

+0

我无法避免构造元组吗? – Eric

0

如果你不使用Python 3的时候,

reduce(lambda x,y: x+y, sequence) 

也适用。由于reduce()已被删除,所以里程可能会有所不同,但替代解决方案总是很好。

+2

或者,你知道,'sum(sequence)' – Eric

+1

这具有O(n^2)的复杂性(并且只是写出sum(sequence,())'的一种神秘方式,其也具有二次复杂性)。请注意'reduce()'在Python 3中没有消失 - 它只是被移到'functools'。 –

0
my_list = [(1, 2), (4, 7), (6, 0)] 
print sum(my_list,()) 

结果

(1, 2, 4, 7, 6, 0) 
+0

这有二次方运行时间,应该避免。 –

+0

@Sven Marnach行。事实上,我对这些O(1),O(2)等等的考虑很少理解。你怎么知道这是二次方? – eyquem

+0

在每一步中,到目前为止创建的整个元组都需要被复制到一个新的元组中,并添加两个额外的元素。如果你用很长的清单来做这件事,那么在操作结束时,每增加两件物品都相当昂贵。您也可以通过测量所需时间来看到这一点。 [使用长度为运行时间百倍的十倍长度的列表](https://gist.github.com/1472334)。 –