I am trying to understand the working of the built-in sum()
function, but, the start
parameter has evaporated my mind:
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
I am just dumbfounded by this and don't have any idea what is happening. Here is what the python docs have to say: http://docs.python.org/library/functions.html#sum. This does not give any explanation on 'what if the start is not a string and not an integer?'
This error has nothing to do with the start parameter. There are two items in the list
b
. One of them is[[[[[1], 2], 3], 4], 5]
, the other is6
, and a list and int cannot be added together.This is adding:
Which works fine (as you're just adding lists to lists).
This is trying to add
[3,4] + 1 + 2
, which again isn't possible. Similarly,sum(b,a)
is adding[1, 2] + 3 + 4
.sum
can't sum strings. See:Sum does something like this
sum([1,2],[3,4])
expands something like[3,4] + 1 + 2
, which you can see tries to add numbers and lists together.In order to use
sum
to produce lists, the values should be a list of lists, whereas start can be just a list. You'll see in your failing examples that the list contains at least some ints, rather then all lists.The usual case where you might think of using sum with lists is to convert a list of lists into a list
But really you shouldn't do that, as it'll be slow.
One of the things that has been hinted at but not explicitly stated in the other answers is that the
start
value defines thetype
for the return value and for the items being summed. Because the default isstart=0
, (and 0 is an integer, of course) all items in the iterable must be integers (or types with an__add__
method that works with integers). Other examples have mentioned concatenating lists:(
sum([[1,2],[3,4]], []) == [1,2,3,4]
)or
timedate.timedelta
objects:(
sum([timedelta(1), timedelta(2)], timedelta()) == timedelta(3)
).Notice that both examples pass an empty object of the type in the iterable as the start parameter to avoid getting a
TypeError: unsupported operand type(s) for +: 'int' and 'list'
error.