Sunday, June 5, 2011

Python's sum()

In Python, the sum() builtin gives you the ability to take a list, say [1, 2, 10] and find the sum of it as if you had written out 1 + 2 + 10.

The + operator is also defined for lists, where if you write out [1] + [2] + [10] you'll get a list back: [1, 2, 10]

What happens if we put these two observations together? Can we sum() a list of lists to get one flattened list?
Python 2.6.5 (r265:79063, Apr 16 2010, 13:09:56) 
[GCC 4.4.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> print sum([[1],[2],[10]])
Traceback (most recent call last):
  File "<stdin>", line 1, in 
TypeError: unsupported operand type(s) for +: 'int' and 'list'
Nope. sum() internally starts with "0 + (first element of sequence)" so you can only pass things that can be added to integers.


Brian Rowe said...

Would that work as expected in Ruby?

sapphirepaw said...

As far as I can tell, Ruby doesn't have a direct equivalent of the sum() built-in. You can make it work with `foo.inject([]){|acc,i| acc+i}` because you pass the initial value yourself. For the trivial example above, `foo.flatten` would be just as good.

I think Python's sum is limited to integers so that the return type is defined for an empty list. Otherwise you can't distinguish between an empty list-of-lists or an empty list-of-ints.