当我想展开一个清单时,我找到了如下方式:
>>> a = [[1, 2], [3, 4], [5, 6]]
>>> a
[[1, 2], [3, 4], [5, 6]]
>>> sum(a, [])
[1, 2, 3, 4, 5, 6]
我不知道这些行发生了什么,the documentation州:
sum(iterable[, start])
从左到右汇总
start
和iterable
的项目 返回总数。start
默认为0
。可迭代的项目是 通常是数字,start
值不允许是字符串。对于某些用例,
sum()
有很好的替代方案。连接字符串序列的首选快速方法是调用''.join(sequence)
。要使用扩展名添加浮点值 精度,见math.fsum()
。要连接一系列迭代, 考虑使用itertools.chain()
。2.3版中的新功能。
你认为开始应该是一个数字吗?为什么可以在这里写[]
?
(sum(a, []))
答案 0 :(得分:27)
默认情况下,你认为开始应该是一个数字吗?
start
是一个数字; 0
,根据您引用的文档。因此当你这样做时:
sum((1, 2))
评估为0 + 1 + 2
,等于3
,每个人都很高兴。如果你想从不同的号码开始,你可以提供它:
>>> sum((1, 2), 3)
6
到目前为止,非常好。
但是,您可以使用其他内容+
,例如列表:
>>> ['foo'] + ['bar']
['foo', 'bar']
如果您尝试使用sum
,但期望得到相同的结果,则会得到TypeError
:
>>> sum((['foo'], ['bar']))
Traceback (most recent call last):
File "<pyshell#2>", line 1, in <module>
sum((['foo'], ['bar']))
TypeError: unsupported operand type(s) for +: 'int' and 'list'
因为它现在在做0 + ['foo'] + ['bar']
。
要解决此问题,您可以提供自己的start
作为[]
,因此它会变为[] + ['foo'] + ['bar']
并且一切都很好。所以回答:
为什么可以在这里写
[]
?
因为虽然start
默认为数字,但 为1;其他的东西也可以添加,这对于的东西来说非常方便,就像你现在正在做的那样。
答案 1 :(得分:5)
实际上sum
函数在每次迭代中使用可迭代的所有项调用__add__
的{{1}}属性。
例如:
start
在这种情况下,结果将是输入列表的连接列表。实际上,在算法视角下,它执行以下过程:
>>> [].__add__([2,3])
[2, 3]
#OR
>>> [] + [1,2,3]
[1, 2, 3]
并非您可以在具有>>> a = [[1, 2], [3, 4], [5, 6]]
>>> start = []
>>> for i in a:
... start += i
...
>>> start
[1, 2, 3, 4, 5, 6]
属性的每个对象序列上调用sum
函数。但请注意,如果您的默认__add__
参数为start
object不是一个整数,它会引发0
。在这种情况下,您需要为函数指定正确的TypeError
。
start
答案 2 :(得分:2)
将start
与您提供的可迭代内容相加作为第一个参数。 sum
不会将type
start
限制为int,以便允许添加各种情况。
基本上,sum会做这样的事情:
a = [[1, 2], [3, 4], [5, 6]]
sum(a, number)
大致翻译为:
number += every value in the list a
由于列表a
中的每个值都是一个列表,因此在扩展时,前一个求和值如下:
number + [1, 2] + [3, 4] + [5, 6]
因此,如果您输入int
,则会导致不幸TypeError
,因为不允许添加int
和list
。
1 + [1, 2] == I hope you like TypeErrors
但是,如果您输入列表[]
,它只会将a
的元素加在一起,并生成我们知道并喜爱的扁平列表。
start
的值默认为0
和int
,主要是因为最常见的求和情况是算术。