微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

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

下面是对应的函数

def flatten(l):
    return [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 项的子列表:第一个 I 项被来回复制 L-1 次,第二个 I 项被复制 L-2 次,依此类推;总副本数是 x 的总和 x 从 1 到 L 被排除在外的 I 倍,即I * (L**2)/2.

列表推导式只生成一个列表,一次,并将每个项目(从其原始居住地复制到结果列表)也恰好一次。

解决方法

我有一个列表列表,例如[[1,2,3],[4,5,6],[7],[8,9]]. 我怎样才能把它弄平[1,3,4,6,7,8,9]

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。