使用`sum(iterable,[])`如何使嵌套列表变平?

Aar*_*tor 6 python list python-3.x

我正在使用python 3.6.我通过以下方式使用以下方法展平嵌套列表sum:

a = [[1, 2], [3, 4], [5, 6]]

sum(a,[])
Run Code Online (Sandbox Code Playgroud)

返回:

[1,2,3,4,5,6]
Run Code Online (Sandbox Code Playgroud)

到底发生了什么?Sum采用可迭代的,在这种情况下是一个列表,以及一个起始值.我不明白python读取什么来展平列表.

bph*_*phi 9

这只是Python解释添加列表的结果.来自文档

sum(iterable[, start])

Sums从左到右开始和可迭代的项目并返回总数.

由于sum通过增加迭代的第一个元素的启动start参数,您有:

[] + [1, 2] = [1, 2]
Run Code Online (Sandbox Code Playgroud)

然后它继续从iterable中添加项目:

[1, 2] + [3, 4] = [1, 2, 3, 4]
[1, 2, 3, 4] + [5, 6] = [1, 2, 3, 4, 5, 6]
Run Code Online (Sandbox Code Playgroud)


use*_*ica 7

sum([a, b, c], d)生产d + a + b + c.

在你的榜样,a,b,c,和d[1, 2],[3, 4],[5, 6],和[].

sum([[1, 2], [3, 4], [5, 6]], [])产生[] + [1, 2] + [3, 4] + [5, 6],这是[1, 2, 3, 4, 5, 6]因为+是列表的连接.

这是非常低效的,因为所+涉及的每个操作都需要从每个参数中复制所有数据:

In [7]: x = [[i] for i in range(30000)]

In [8]: %timeit sum(x, [])
1 loop, best of 3: 2.06 s per loop

In [9]: %timeit [elem for sublist in x for elem in sublist]
1000 loops, best of 3: 1.91 ms per loop
Run Code Online (Sandbox Code Playgroud)

sum(x, [])采用二次时间,而更有效的实现需要线性时间.永远不会sum(x, []).


Moi*_*dri 6

正如sum(iterable[, start])文件所说:

资金start和一个项目iterable从左到右,并返回总.start默认为0.这些iterable项通常是数字,起始值不允许是字符串.

所以,在您分享的示例中:

sum(a,[])
Run Code Online (Sandbox Code Playgroud)

在这里,iterablea (这是[[1, 2], [3, 4], [5, 6]])并且start[].因此,结果相当于:

[] + [1, 2] + [3, 4] + [5, 6]

# i.e. you flatten list --> [1, 2, 3, 4, 5, 6] 
Run Code Online (Sandbox Code Playgroud)