zip list, variables
Jussi Piitulainen
jpiitula at ling.helsinki.fi
Wed Nov 20 11:45:58 CET 2013
flebber <flebber.crue at gmail.com> writes:
> If
>
> c = map(sum, zip([1, 2, 3], [4, 5, 6]))
>
> c
> Out[7]: [5, 7, 9]
>
> why then can't I do this?
>
> a = ([1, 2], [3, 4])
>
> b = ([5, 6], [7, 8])
>
> c = map(sum, zip(a, b))
> ---------------------------------------------------------------------------
> TypeError Traceback (most recent call last)
> <ipython-input-3-cc046c85514b> in <module>()
> ----> 1 c = map(sum, zip(a, b))
>
> TypeError: unsupported operand type(s) for +: 'int' and 'list'
The error message comes from sum(([1,2],[5,6])), where start defaults
to 0. A way to understand what is happening is to inspect zip(a,b),
notice that the first element of zip(a,b) is ([1,2],[5,6]), and then
find out what sum(([1,2],[5,6])) is. The extra parentheses may seem a
bit subtle, and at least in Python 3, zip and map return opaque
objects, so it does take a bit to get used to all the details,
The offending operands to '+' are 0 and [1,2].
> How can I do this legally?
I think the easiest is [ x + y for x, y in zip(a,b) ] if you want
concatenation, and something like the following if you want a nested
numerical addition:
>>> [ [ x + y for x, y in zip(x,y) ] for x, y in zip(a,b) ]
[[6, 8], [10, 12]]
There is probably a way to use map and sum for this, together with the
mechanisms that change arguments to lists or vice versa (the syntax
involves *), and partial application to specify a different start for
sum if you want concatenation, but I doubt you can avoid some sort of
nesting in the expression, and I doubt it will be clearer than the
above suggestions. But someone may well show a way. (Sorry if this
paragraph sounds like so much gibberish.)
More information about the Python-list
mailing list