我正在使用python 3.6。我遇到了以下使用sum来平平嵌套列表的方法
a = [[1, 2], [3, 4], [5, 6]]
sum(a,[])返回:
[1,2,3,4,5,6]这到底是怎么回事?Sum需要一个可迭代的,在本例中是一个列表和一个开始值。我不明白python会读些什么来使列表变平。
发布于 2018-04-17 21:12:31
这只是Python如何解释列表添加的结果。来自文档
sum(iterable[, start])和、开始和可从左到右迭代的项,并返回总计。
由于sum从将可迭代的第一个元素添加到start参数开始,您可以:
[] + [1, 2] = [1, 2]然后,它继续从迭代中添加项:
[1, 2] + [3, 4] = [1, 2, 3, 4]
[1, 2, 3, 4] + [5, 6] = [1, 2, 3, 4, 5, 6]发布于 2018-04-17 21:22:23
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 loopsum(x, [])需要二次时间,而更有效的实现则需要线性时间。永远不要做sum(x, [])。
发布于 2018-04-17 21:13:26
正如sum(iterable[, start])文档所述:
start从左到右将、、和的项相加,并返回总。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] https://stackoverflow.com/questions/49887524
复制相似问题