将列表中的嵌套列表展开为单个列表

8

我有一个元组的列表,而该列表本身又包含其他列表:

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

如何制作一个元组列表:
b = [(1, 2), (3, 4), (5, 6), (7, 8), (9, 10)]

朴素的方法是:

b = []
for c in a:
    for t in c:
        b.append(t)

列表推导式或其他任何想法都可以接受。

2
[i for b in a for i in b]? - Ajax1234
1
在我看来,最好的方法是使用functools模块中的reduce函数。b = functools.reduce(list.__add__, a) - Jack Homan
@juanpa.arrivillaga 我有什么遗漏吗?那个列表推导式中有两个for循环...这也是二次运行时间。我刚刚计时了一下,reduce更快。我不是想争论什么。如果我理解错了什么,那我想学习一下。 - Jack Homan
@JackHoman,仅仅因为有两个for循环并不意味着它是二次时间复杂度。当n是所有子列表中元素的数量时,时间复杂度为O(N),它只会一次访问每个元素。使用+运算符每次都会得到一个新列表,每个中间步骤都会再次访问您已经访问过的所有元素... - juanpa.arrivillaga
@juanpa.arrivillaga 哦,好的,那很有道理。谢谢 - Jack Homan
显示剩余7条评论
3个回答

11

使用 itertools

示例:

import itertools
a = [[(1, 2), (3, 4), (5, 6)], [(7, 8), (9, 10)]]
print(list(itertools.chain(*a)))

输出:

[(1, 2), (3, 4), (5, 6), (7, 8), (9, 10)]

1
chain.from_iterable来解包,而不是使用* - PM 2Ring
如果你想使用内置的Python函数,可以使用'reduce':在你的情况下,代码应该是'b = reduce(lambda x,y : x+y, a)'。 - Cyrus Dsouza

8
在其他一些语言中,这个操作被称为'flatten'。 在Python中,以下方法可能是最短的。
a = [[(1, 2), (3, 4), (5, 6)], [(7, 8), (9, 10)]]
sum(a, [])
// [(1, 2), (3, 4), (5, 6), (7, 8), (9, 10)]

它还可以在父列表有许多子列表的情况下工作。
b = [[1],[2],[3],[4],[5]]
sum(b, [])
// [1, 2, 3, 4, 5]

2
不要使用 sum 来展开列表,这是二次时间。 - juanpa.arrivillaga

5

您不需要追加,而是需要扩展。您可以使用非常简单的循环

a = [[(1, 2), (3, 4), (5, 6)], [(7, 8), (9, 10)]]
single_level_list = []
for lst in a:
    single_level_list.extend(lst)

print(single_level_list)

>>> [(1, 2), (3, 4), (5, 6), (7, 8), (9, 10)]

for lst in a: single_level_list += lst 这个代码的可读性更好。 - DSchmidt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接