给定列表t
的列表,
flat_list = [item for sublist in t for item in sublist]
也就是说:
flat_list = []
for sublist in t:
for item in sublist:
flat_list.append(item)
比目前发布的快捷方式更快.(t
是要展平的列表.)
下面是相应的函数:
def flatten(t):
return [item for sublist in t for item in sublist]
作为证据,您可以使用标准库中的timeit
模块:
$ python -mtimeit -s't=[[1,2,3],[4,5,6], [7], [8,9]]*99' '[item for sublist in t for item in sublist]'
10000 loops, best of 3: 143 usec per loop
$ python -mtimeit -s't=[[1,2,3],[4,5,6], [7], [8,9]]*99' 'sum(t, [])'
1000 loops, best of 3: 969 usec per loop
$ python -mtimeit -s't=[[1,2,3],[4,5,6], [7], [8,9]]*99' 'reduce(lambda x,y: x+y,t)'
1000 loops, best of 3: 1.1 msec per loop
说明:当有T个子列表时,基于+
的快捷方式(包括sum
中的隐含用法)必然是O(T**2)
--随着中间结果列表不断变长,在每一步都会分配一个新的中间结果列表对象,并且必须复制前一个中间结果中的所有项(以及在末尾添加的几个新项).因此,为简单起见,在不丧失一般性的情况下,假设您有T个子列表,每个子列表包含k个项目:前k个项目来回复制T-1次,后k个项目复制T-2次,依此类推;副本总数是x从1到T之和的k倍,即k * (T**2)/2
.
列表理解只生成一个列表,只需一次,并且将每个项目(从其原始居住地复制到结果列表)也恰好复制一次.