3 回答
![?](http://img1.sycdn.imooc.com/545863aa00014aa802200220-100-100.jpg)
TA贡献1830条经验 获得超9个赞
给出列表清单l,
flat_list = [item for sublist in l for item in sublist]
意思是:
flat_list = []
for sublist in l:
for item in sublist:
flat_list.append(item)
比目前发布的快捷方式快。(l是要压扁的列表。)
这是相应的功能:
flatten = lambda l: [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)- 当中间结果列表持续变长时,在每个步骤分配新的中间结果列表对象,以及所有项目必须复制之前的中间结果(以及最后添加的一些新结果)。因此,为了简单而没有实际失去一般性,请说每个项目都有L个子列表:第一个I项目来回复制L-1次,第二个I项目L-2次,依此类推; 总拷贝数是I乘以x的总和,从1到L排除,即I * (L**2)/2。
列表理解只生成一个列表一次,并将每个项目(从其原始居住地点到结果列表)复制一次。
![?](http://img1.sycdn.imooc.com/533e4ce900010ae802000200-100-100.jpg)
TA贡献1887条经验 获得超5个赞
你可以使用itertools.chain()
:
>>> import itertools>>> list2d = [[1,2,3],[4,5,6], [7], [8,9]]>>> merged = list(itertools.chain(*list2d))
或者,在Python> = 2.6,使用itertools.chain.from_iterable()
不需要解压缩列表:
>>> import itertools>>> list2d = [[1,2,3],[4,5,6], [7], [8,9]]>>> merged = list(itertools.chain.from_iterable(list2d))
这种方法可以说更具可读性,[item for sublist in l for item in sublist]
而且看起来更快:
这种方法可以说更具可读性,[item for sublist in l for item in sublist]而且看起来更快:
[me@home]$ python -mtimeit -s'l=[[1,2,3],[4,5,6], [7], [8,9]]*99;import itertools' 'list(itertools.chain.from_iterable(l))'
10000 loops, best of 3: 24.2 usec per loop
[me@home]$ 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: 45.2 usec per loop
[me@home]$ python -mtimeit -s'l=[[1,2,3],[4,5,6], [7], [8,9]]*99' 'sum(l, [])'
1000 loops, best of 3: 488 usec per loop
[me@home]$ 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: 522 usec per loop
[me@home]$ python --version
Python 2.7.3
添加回答
举报