Python将嵌套元组的列表转换为元组列表

时间:2017-04-15 11:52:53

标签: python list tuples

我有一个嵌套元组列表

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

如何将其转换为元组列表

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

不使用for循环

2 个答案:

答案 0 :(得分: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')]

答案 1 :(得分:2)

您可以将 list comprehension generator 一起用作tuple(..)构造函数中的元素:

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

粗体中的代码片段是生成器:对于每个row(即(('p1', 'p2'), ('m1',))),它会产生两个级别的元素所以:p1p2m1。这些转换为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(..)和{{1}仍然存在循环机制函数。