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
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()
reduce was removed from python 3: docs.python.org/3.0/whatsnew/3.0.html#builtinsoperator.mul, lambda x, y: x * y works fine also. Although really there is nothing wrong with op.mul to begin with :).reduce info - I have updated the answer.functools.reduce(op.mul, (sum(x) for x in list(zip(*list_))[:-1])) ?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])
zip(*) is a sledgehammer when you could just do it with pure python. Using reduce simply does the same thing your code does but more concisereduce is a built-in as well as zip so its just that I personally find this way easier to read.zip is a Python 3 built-in but reduce is not, so my way is Python 2/3 agnostic.
list_ = [(1,2), (3,4), (5,6)]?(1+3+5) * (2+4+6) = 108