2017-04-15 149 views
0

我作为Python的转换嵌套的元组的列表列出元组

[(('p1', 'p2'), ('m1',)), (('p2', 'p1'), ('m1',))] 

嵌套的元组的列表的我怎样才能将它转换成元组的列表,

[('p1', 'p2', 'm1'), ('p2', 'p1', 'm1')] 

不使用循环

+0

是元组嵌套的任意深?还是只有两个级别? –

+0

固定,只有两个级别 – Nitin

+0

允许列表理解中的'for's?这真是一种不同的'for'循环。 –

回答

3

你可以用itertools.chain做,

In [91]: from itertools import chain 
In [92]: [tuple(chain(*item)) for item in a] 
Out[92]: [('p1', 'p2', 'm1'), ('p2', 'p1', 'm1')] 
2

您可以使用列表理解生成器作为tuple(..)中的元素con structor:

[tuple(x for elem in row for x in elem) for row in data]

粗体的代码片段发生器:每row(即(('p1', 'p2'), ('m1',)))它产生两个深度的元素,因此:p1,p2m1。这些被转换成tuple

或者你可以使用itertools

from itertools import chain 

[tuple(chain(*row)) for row in data]

这产生:

>>> data = [(('p1', 'p2'), ('m1',)), (('p2', 'p1'), ('m1',))] 
>>> [tuple(x for elem in row for x in elem) for row in data] 
[('p1', 'p2', 'm1'), ('p2', 'p1', 'm1')] 
>>> [tuple(chain(*row)) for row in data] 
[('p1', 'p2', 'm1'), ('p2', 'p1', 'm1')] 

您还可以使用itertools.starmap(..)list(..)删除列表理解:

from itertools import chain, starmap 

list(map(tuple,starmap(chain,data)))

其中给出:

>>> list(map(tuple,starmap(chain,data))) 
[('p1', 'p2', 'm1'), ('p2', 'p1', 'm1')] 

注意,虽然你不一个for环路自己,当然还有在列表理解或map(..)starmap(..)功能代替循环机制。

+0

我可以使用像itertools这样的链(*)的东西来做到这一点。不确定。不想使用“for” – Nitin

+0

@Nitin:是的。这是做这件事的另一种方法。如所证明的。 –

+0

谢谢!威廉。正是我想要的 – Nitin