Aar*_*tor 6 python list python-3.x
我正在使用python 3.6.我通过以下方式使用以下方法展平嵌套列表sum:
a = [[1, 2], [3, 4], [5, 6]]
sum(a,[])
返回:
[1,2,3,4,5,6]
到底发生了什么?Sum采用可迭代的,在这种情况下是一个列表,以及一个起始值.我不明白python读取什么来展平列表.
这只是Python解释添加列表的结果.来自文档
sum(iterable[, start])Sums从左到右开始和可迭代的项目并返回总数.
由于sum通过增加迭代的第一个元素的启动start参数,您有:
[] + [1, 2] = [1, 2]
然后它继续从iterable中添加项目:
[1, 2] + [3, 4] = [1, 2, 3, 4]
[1, 2, 3, 4] + [5, 6] = [1, 2, 3, 4, 5, 6]
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
sum(x, [])采用二次时间,而更有效的实现需要线性时间.永远不会sum(x, []).
正如sum(iterable[, start])文件所说:
资金
start和一个项目iterable从左到右,并返回总.start默认为0.这些iterable项通常是数字,起始值不允许是字符串.
所以,在您分享的示例中:
sum(a,[])
在这里,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]