我正在尝试了解内置sum()
函数的工作原理,但是,start
参数让我大开眼界:
a=[[1, 20], [2, 3]]
b=[[[[[[1], 2], 3], 4], 5], 6]
>>> sum(b,a)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: can only concatenate list (not "int") to list
>>> sum(a,b)
[[[[[[1], 2], 3], 4], 5], 6, 1, 20, 2, 3]
>>> a=[1,2]
>>> b=[3,4]
>>> sum(a,b)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: can only concatenate list (not "int") to list
>>> sum(b,a)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: can only concatenate list (not "int") to list
我只是对此感到茫然,并且不知道发生了什么。以下是python文档所说的内容:http://docs.python.org/library/functions.html#sum。这没有给出'如果开始不是字符串而不是整数怎么办?'
的任何解释答案 0 :(得分:16)
Sum做了类似的事情
def sum(values, start = 0):
total = start
for value in values:
total = total + value
return total
sum([1,2],[3,4])
扩展了类似[3,4] + 1 + 2
的内容,您可以看到尝试一起添加数字和列表。
为了使用sum
生成列表,值应该是列表列表,而start可以只是一个列表。您将在失败的示例中看到该列表至少包含一些整数,而不是所有列表。
您可能会想到将sum与list一起使用的常见情况是将列表列表转换为列表
sum([[1,2],[3,4]], []) == [1,2,3,4]
但实际上你不应该这样做,因为它会很慢。
答案 1 :(得分:4)
a=[[1, 20], [2, 3]]
b=[[[[[[1], 2], 3], 4], 5], 6]
sum(b, a)
此错误与start参数无关。列表b
中有两个项目。其中一个是[[[[[1], 2], 3], 4], 5]
,另一个是6
,并且列表和int不能一起添加。
sum(a, b)
这是补充:
[[[[[[1], 2], 3], 4], 5], 6] + [1, 20] + [2, 3]
哪种方法正常(因为您只是将列表添加到列表中)。
a=[1,2]
b=[3,4]
sum(a,b)
这是尝试添加[3,4] + 1 + 2
,这是不可能的。同样,sum(b,a)
正在添加[1, 2] + 3 + 4
。
如果start不是字符串而不是整数怎么办?
sum
无法对字符串求和。参见:
>>> sum(["a", "b"], "c")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: sum() can't sum strings [use ''.join(seq) instead]
答案 2 :(得分:1)
其他答案中暗示但未明确说明的事情之一是 start
值定义了返回值的type
和要求的项目< / strong>即可。因为默认值是start=0
,(当然,0是一个整数),iterable中的所有项必须是整数(或者带有__add__
方法的类型才能使用整数)。其他例子提到了连接列表:
(sum([[1,2],[3,4]], []) == [1,2,3,4]
)
或timedate.timedelta
个对象:
(sum([timedelta(1), timedelta(2)], timedelta()) == timedelta(3)
)。
请注意,两个示例都将iterable中类型的空对象作为start参数传递,以避免出现TypeError: unsupported operand type(s) for +: 'int' and 'list'
错误。
答案 3 :(得分:0)
我只是想澄清一些困惑。
sum函数的签名应该是:
list.get(0).get("firstname");
而不是
sum(iterable,start=0)
如上所述。此更改将使签名更清晰。
全功能:
sum(values,start=0)