如何快速合并列表中的列表?

除了循环,有没有更快的方法来实现一行合并列表中的列表?

比如这样的:

l = [[1,2,3],[4,5,6], [7], [8,9]]
reduce(lambda x,y: x.extend(y),l)

当然上面这样会报错。。

Solve

目前看来,最快的方法应该是:

[item for sublist in l for item in sublist]

可以用 timeit 模块进行验证:

$ python -mtimeit -s'l=[[1,2,3],[4,5,6], [7], [8,9]]*99' '[item for sublist in l for item in sublist]'
10000 loops, best of 3: 143 usec per loop
$ python -mtimeit -s'l=[[1,2,3],[4,5,6], [7], [8,9]]*99' 'sum(l, [])'
1000 loops, best of 3: 969 usec per loop
$ python -mtimeit -s'l=[[1,2,3],[4,5,6], [7], [8,9]]*99' 'reduce(lambda x,y: x+y,l)'
1000 loops, best of 3: 1.1 msec per loop

解释

当有 L 个子串的时候用 +,即 (sum)的时间复杂度是 O(L**2),每次迭代的时候作为中间结果的列表的长度就会越来越长,而且前一个中间结果的所有项都会再拷贝一遍给下一个中间结果。所以当你的列表 I 含有 L 个子串,I 列表的第一项需要拷贝 L-1 次,而第二项要拷贝 L-2 次,以此类推总数为: I * (L ** 2) / 2

列表推导式(list comprehension)只是生成一个列表,每次运行只拷贝一次(从开始的地方拷贝到最终结果)

Last updated