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

我有一个列表列表,例如 [[1, 2, 3], [4, 5, 6], [7], [8, 9]]。如何将其展平以获得 [1, 2, 3, 4, 5, 6, 7, 8, 9]


如果您的列表列表来自嵌套列表推导,则可以通过修复推导更简单/直接地解决问题;请看 python list comprehensions; compressing a list of lists? .

这里最流行的解决方案通常只展平嵌套列表的一个“级别”。见 Flatten an irregular (arbitrarily nested) list of lists用于完全扁平化深度嵌套结构的解决方案(通常是递归的)。

最佳答案

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

说明:基于+的快捷键(包括sum中的隐含使用)必然是O(L**2) 当有 L 个子列表时——随着中间结果列表越来越长,每一步都会分配一个新的中间结果列表对象,并且必须复制上一个中间结果中的所有项目(以及一些新的项目)最后添加)。因此,为简单起见且不失一般性,假设您有 L 个包含 I 项的子列表:第一个 I 项被来回复制 L-1 次,第二个 I 项被复制 L-2 次,依此类推;总副本数是 I 乘以 x 从 1 到 L 的 x 的总和,即 I * (L**2)/2

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

https://stackoverflow.com/questions/952914/

相关文章:

windows - 如何在 Windows 上安装 pip?

python - __str__ 和 __repr__ 有什么区别?

python - 检查给定键是否已存在于字典中

python - 在一行中捕获多个异常( block 除外)

python - 如何通过引用传递变量?

python - 如何向字典添加新键?

python - "Least Astonishment"和可变默认参数

python - 我如何做一个时间延迟?

python - 如何获取当前时间?

python - 如何制作函数装饰器并将它们链接在一起?