给定列表列表
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
解释:基于
+
的快捷方式(包括
sum
中的隐含使用)是必要的,当有T个子列表时--随着中间结果列表越来越长,每个步骤都会分配一个新的中间结果列表对象,并且必须复制前一个中间结果中的所有项目(以及最后添加的一些新项目)。 因此,为了简单起见,并且没有实际的一般性损失,假设您有T个k项的子列表:第一个k项被来回复制T-1次,第二个k项被复制T-2次,依此类推;总副本数是x的总和的k倍x从1到T排除,即
k * (T**2)/2
。
列表理解只是生成一个列表,一次,并复制每个项目(从其原始居住地到结果列表)也正好一次。
您可以使用
itertools.chain()
:或者你可以使用
itertools.chain.from_iterable()
不需要用*
运算符解包列表: