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读取什么来展平列表.
这只是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)
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, [])
.
正如sum(iterable[, start])
文件所说:
资金
start
和一个项目iterable
从左到右,并返回总.start
默认为0.这些iterable
项通常是数字,起始值不允许是字符串.
所以,在您分享的示例中:
sum(a,[])
Run Code Online (Sandbox Code Playgroud)
在这里,iterable
是a
(这是[[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)