知优码

您现在的位置是:首页 > python语言 > python教程

python教程

python从列表中制作平面列表

2021-01-23python教程
python从列表中制作平面列表

一、概述

我想知道是否有捷径可以从Python的列表清单中做出一个简单的清单。

我可以for循环执行此操作,但也许有一些很酷的“单线”功能?我尝试使用reduce(),但出现错误。

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

错误信息

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 1, in <lambda>
AttributeError: 'NoneType' object has no attribute 'extend'
 

二、详解

给定一个列表列表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是要展平的列表。)

这是相应的功能:

flatten = lambda t: [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的快捷方式+(包括中的隐含使用sumO(T**2)在有T子列表时必不可少-随着中间结果列表的不断增加,每一步都会分配一个新的中间结果列表对象,并且所有项目必须复制以前的中间结果中的结果(以及最后添加的一些新结果)。因此,为简单起见,而又不失去一般性,请假设您有k个项目的T个子列表:前k个项目来回复制T-1次,后k个项目T-2次,依此类推;等等。总拷贝数是k的x乘以x的总和(从1到T排除在外),即k * (T**2)/2

列表理解仅生成一次列表,然后将每一项(从其原始居住地复制到结果列表)也仅复制一次。