内置函数sum与sum(list,[])有什么关系?

时间:2015-11-05 10:17:27

标签: python

当我想展开一个清单时,我找到了如下方式:

>>> 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])

     

从左到右汇总startiterable的项目   返回总数。 start默认为0。可迭代的项目是   通常是数字,start值不允许是字符串。

     

对于某些用例,sum()有很好的替代方案。连接字符串序列的首选快速方法是调用   ''.join(sequence)。要使用扩展名添加浮点值   精度,见math.fsum()。要连接一系列迭代,   考虑使用itertools.chain()

     

2.3版中的新功能。

你认为开始应该是一个数字吗?为什么可以在这里写[]

(sum(a, []))

3 个答案:

答案 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,因为不允许添加intlist

1 + [1, 2] == I hope you like TypeErrors

但是,如果您输入列表[],它只会将a的元素加在一起,并生成我们知道并喜爱的扁平列表。

start的值默认为0int,主要是因为最常见的求和情况是算术。