在嵌套列表中展平元组

时间:2017-09-11 09:56:26

标签: python list indexing tuples

是否有一个紧凑的oneliner或python成语来处理以下任务?

我想像这样转换一个元组列表列表:

input = [[(1,2,3),(4,5,6)],[(7,8,9),(10,11,12)]]

到此:

output [[1,2,3,7,8,9], [4,5,6,10,11,12]]

使用地图并展平列表只给了我以下内容

input_trans = map(list, zip(*input))
input_trans_flat = [item for sublist in input_trans for item in sublist]
Out: [(1, 2, 3), (7, 8, 9), (4, 5, 6), (10, 11, 12)]

非常感谢提前!

4 个答案:

答案 0 :(得分:2)

我做:

output = [list(a + b) for a, b in zip(*input)]

正如您所知,zip部分会转置列表的外部列表。然后我抓住每对元组并连接它们,然后将组合元组转换成列表。如果您不关心最后是否有列表列表或元组列表,您可以摆脱list电话。

答案 1 :(得分:2)

您应该能够使用sumBlckknght's answer推广到列表中的任意数量的元组。

output = [list(sum(x, ())) for x in zip(*input)]
print(output)
[[1, 2, 3, 7, 8, 9], [4, 5, 6, 10, 11, 12]]

答案 2 :(得分:0)

您可以将list comprehensionzip()一起使用,如下所示:

output = [[item for tup in (i, j) for item in tup] for i, j in zip(*input)]

<强>输出:

>>> input = [[(1, 2, 3), (4, 5, 6)], [(7, 8, 9), (10, 11, 12)]]
>>>
>>> output = [[item for tup in (i, j) for item in tup] for i, j in zip(*input)]
>>> output
[[1, 2, 3, 7, 8, 9], [4, 5, 6, 10, 11, 12]]

答案 3 :(得分:-1)

这是一种方式。

from itertools import chain
l = [[(1,2,3),(4,5,6)],[(7,8,9),(10,11,12)]]
[list(chain.from_iterable(s)) for s in l]

给了我

[[1, 2, 3, 4, 5, 6], [7, 8, 9, 10, 11, 12]]