Python-在Python中展平浅表

发布于 2021-02-02 23:24:32

如何从列表列表中制作平面列表?

关注者
0
被浏览
171
1 个回答
  • 面试哥
    面试哥 2021-02-02
    为面试而生,有面试问题,就找面试哥。

    给定一个列表列表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
    

    说明:基于快捷方式+(包括中的隐含使用sum)的必要性是O(L**2)当存在L个子列表时-随着中间结果列表的长度越来越长,每一步都会分配一个新的中间结果列表对象,并且所有项目必须复制之前的中间结果中的结果(以及最后添加的一些新结果)。因此,为简单起见,并且不失去一般性,请说你每个都有I个项目的L个子列表:第一个I项目来回复制L-1次,第二个I项目L-2次,依此类推;等等。总份数是I乘以x的总和(从1到L排除在外),即I * (L**2)/2

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



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看