回答

收藏

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

技术问答 技术问答 264 人阅读 | 0 人回复 | 2023-09-11

是否有从 Python 在列表列表中制作简单列表的快捷方式?) e. c. N) O% q! o
我可以for循环,但是有没有一些很酷的单线?4 X) Q  _- I9 B3 Q4 @, U
我试过functools.reduce():
) b: f, U0 O0 o" a2 H( e2 N
    from functools import reducel = [1,2,3],[4,5,6],[7],[8,9]reduce(lambda x,y: x.extend(y),l)
    $ K' C% g# r; ]- E1 `
但我收到了这个错误:
! O+ e: {$ q: j8 d7 r; L/ L
    Traceback (most recent call last):  File "",line 1,in   File "",line 1,in AttributeError: 'NoneType' object has no attribute 'extend'
    9 Y0 L4 h& r- u0 @/ ]
               
6 H9 Y  i! N  W5 L- y: ^    解决方案:                                                                6 P' G- I# a. t' h. z7 E* x# o
                                                                给出列表列表t,4 |1 [: t$ s% r# ?9 f
    flat_list = [item for sublist in t for item in sublist], X: D2 c& r, p* y/ ?1 b6 A2 w
意思是:
0 S- V9 E( @* Q' {3 M7 e+ _' U; R
    flat_list = []for sublist in t:    for item in sublist:        flat_list.append(item)# H& |; \$ _9 @- ?  V
比到目前为止发布的快捷方式更快。(t列表要展平。" G$ I1 z: X+ e2 F0 `' ?7 k3 l
以下是对应函数:. [3 l( t: q8 `0 O
    def flatten(t):    return [item for sublist in t for item in sublist]: E5 a: G" F) p- O  m* ~
你可以用作证据timeit标准库中的模块:2 {8 W7 g+ I% ]9 m9 ?. k" q# O
    $ 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
    $ ?& x3 I. S3 }) h( v+ q
说明:基于 (包括 )in 隐含使用sum)快捷的方法是,O(T**2)当有 T 个子列表-随着中间结果列表越来越长,每一步都会分配一个新的中间结果列表对象,所有项目都必须复制以前的中间结果(以及一些最终添加的新结果)。因此,假设每个子列表都有 k项目:前 k 项目来回复制 T-1 次,后 k 个项目 T-2 次,以此类推;从 1 到  T 排除的 x,总副本为 x 总和的 k 倍,即k * (T**2)/2。1 ]9 L+ X9 c1 T3 V
列表推导式只生成一个列表,复制每个项目(从原住所到结果列表)一次。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则