首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用“`sum(iterable,[])”对嵌套列表进行平坦是如何工作的?

使用“`sum(iterable,[])”对嵌套列表进行平坦是如何工作的?
EN

Stack Overflow用户
提问于 2018-04-17 21:09:11
回答 4查看 807关注 0票数 6

我正在使用python 3.6。我遇到了以下使用sum来平平嵌套列表的方法

代码语言:javascript
复制
a = [[1, 2], [3, 4], [5, 6]]

sum(a,[])

返回:

代码语言:javascript
复制
[1,2,3,4,5,6]

这到底是怎么回事?Sum需要一个可迭代的,在本例中是一个列表和一个开始值。我不明白python会读些什么来使列表变平。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2018-04-17 21:12:31

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

sum(iterable[, start]) 和、开始和可从左到右迭代的项,并返回总计。

由于sum从将可迭代的第一个元素添加到start参数开始,您可以:

代码语言:javascript
复制
[] + [1, 2] = [1, 2]

然后,它继续从迭代中添加项:

代码语言:javascript
复制
[1, 2] + [3, 4] = [1, 2, 3, 4]
[1, 2, 3, 4] + [5, 6] = [1, 2, 3, 4, 5, 6]
票数 9
EN

Stack Overflow用户

发布于 2018-04-17 21:22:23

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

在您的示例中,abcd分别是[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],因为+是列表的级联。

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

代码语言:javascript
复制
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, [])

票数 8
EN

Stack Overflow用户

发布于 2018-04-17 21:13:26

正如sum(iterable[, start])文档所述:

start从左到右将、、和的项相加,并返回总start默认为0。iterable的项通常是数字,并且不允许开始值是字符串。

因此,在您共享的示例中:

代码语言:javascript
复制
sum(a,[])

这里,iterablea (即[[1, 2], [3, 4], [5, 6]]__),start[]。因此,其结果相当于:

代码语言:javascript
复制
[] + [1, 2] + [3, 4] + [5, 6]

# i.e. you flatten list --> [1, 2, 3, 4, 5, 6] 
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49887524

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档