回答

收藏

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

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

是否有从 Python 在列表列表中制作简单列表的快捷方式?$ _  ~+ [: O* t# l$ N9 t
我可以for循环,但是有没有一些很酷的单线?% u4 x2 p& }+ F9 o# O
我试过functools.reduce():
  @+ t, L' o& D& y4 B
    from functools import reducel = [1,2,3],[4,5,6],[7],[8,9]reduce(lambda x,y: x.extend(y),l)
    ( S7 |( o1 j* E0 W$ T, r' P
但我收到了这个错误:5 T8 `& u; A" H0 t
    Traceback (most recent call last):  File "",line 1,in   File "",line 1,in AttributeError: 'NoneType' object has no attribute 'extend': y! H2 A- I* K' |& a5 Q$ C/ W
               
; J/ L/ `% I$ F- `3 M$ R    解决方案:                                                                % H2 Z6 n& Q. ^
                                                                给出列表列表t,# n7 U; e9 H" }0 O2 N) z8 I
    flat_list = [item for sublist in t for item in sublist]
    5 V$ G, V- q) c* T* r' f9 E
意思是:& C; d4 J5 k, k8 L" m# y, m3 [
    flat_list = []for sublist in t:    for item in sublist:        flat_list.append(item). d2 _3 V1 s4 W6 ]1 i
比到目前为止发布的快捷方式更快。(t列表要展平。6 M+ Q# t% w9 L4 y7 [. C
以下是对应函数:7 _; \7 x( \) G* [9 ?' l
    def flatten(t):    return [item for sublist in t for item in sublist]7 E  X+ K  F8 a$ i9 J( p, R
你可以用作证据timeit标准库中的模块:2 S5 g5 C+ c+ {0 r* s% 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 loop4 w3 g4 r; I  q$ t
说明:基于 (包括 )in 隐含使用sum)快捷的方法是,O(T**2)当有 T 个子列表-随着中间结果列表越来越长,每一步都会分配一个新的中间结果列表对象,所有项目都必须复制以前的中间结果(以及一些最终添加的新结果)。因此,假设每个子列表都有 k项目:前 k 项目来回复制 T-1 次,后 k 个项目 T-2 次,以此类推;从 1 到  T 排除的 x,总副本为 x 总和的 k 倍,即k * (T**2)/2。# t2 I( m; C( I- E3 U# p& D. ^8 M6 @
列表推导式只生成一个列表,复制每个项目(从原住所到结果列表)一次。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则