list_ = [(1, 2), (3, 4)]
What is the Pythonic way of taking sum of ordered pairs from inner tuples and multiplying the sums? For the above example:
(1 + 3) * (2 + 4) = 24
2 Answers 2
For example:
import operator as op
import functools
functools.reduce(op.mul, (sum(x) for x in zip(*list_)))
works for any length of the initial array as well as of the inner tuples.
Another solution using numpy:
import numpy as np
np.array(list_).sum(0).prod()
-
-
2@erip because
reduce
was removed from python 3: docs.python.org/3.0/whatsnew/3.0.html#builtinsMB-F– MB-F2016年01月04日 14:44:35 +00:00Commented Jan 4, 2016 at 14:44 -
1@eumiro just to add to the available options: rather than importing
operator.mul
,lambda x, y: x * y
works fine also. Although really there is nothing wrong withop.mul
to begin with :).Nelewout– Nelewout2016年01月04日 14:45:34 +00:00Commented Jan 4, 2016 at 14:45 -
@kazemakase: thank you for the
reduce
info - I have updated the answer.eumiro– eumiro2016年01月04日 14:45:51 +00:00Commented Jan 4, 2016 at 14:45 -
1@blackened: how about
functools.reduce(op.mul, (sum(x) for x in list(zip(*list_))[:-1]))
?eumiro– eumiro2016年01月05日 14:06:28 +00:00Commented Jan 5, 2016 at 14:06
If the lists are small as is implied, I feel that using operator
and itertools
for something like this is applying a sledgehammer to a nut. Likewise numpy
. What is wrong with pure Python?
result = 1
for s in [ sum(x) for x in zip( *list_) ]:
result *= s
(although it would be a lot nicer if pure
Python had a product
built-in as well as sum
). Also if you are specifically dealing only with pairs of 2-tuples then any form of iteration is a sledgehammer. Just code
result = (list_[0][0]+list_[1][0] )*( list_[0][1]+list_[1][1])
-
1You could also argue that using
zip(*)
is a sledgehammer when you could just do it with pure python. Usingreduce
simply does the same thing your code does but more concisejamylak– jamylak2016年01月05日 03:52:17 +00:00Commented Jan 5, 2016 at 3:52 -
Yes,
reduce
is a built-in as well aszip
so its just that I personally find this way easier to read.nigel222– nigel2222016年01月05日 14:58:54 +00:00Commented Jan 5, 2016 at 14:58 -
Actually my previous is wrong.
zip
is a Python 3 built-in butreduce
is not, so my way is Python 2/3 agnostic.nigel222– nigel2222016年01月05日 15:40:19 +00:00Commented Jan 5, 2016 at 15:40
list_ = [(1,2), (3,4), (5,6)]
?(1+3+5) * (2+4+6) = 108