list_ = [(1, 2), (3, 4)]
Что такое питонический способ получения суммы упорядоченных пар из внутренних кортежей и умножения сумм? Для приведенного выше примера:Работа с вложенными списками в Python
(1 + 3) * (2 + 4) = 24
list_ = [(1, 2), (3, 4)]
Что такое питонический способ получения суммы упорядоченных пар из внутренних кортежей и умножения сумм? Для приведенного выше примера:Работа с вложенными списками в Python
(1 + 3) * (2 + 4) = 24
Например:
import operator as op
import functools
functools.reduce(op.mul, (sum(x) for x in zip(*list_)))
работ для любой длины исходного массива, а также из внутренних кортежей.
Другое решение с использованием numpy:
import numpy as np
np.array(list_).sum(0).prod()
Это работает, но это Pythonic? –
@PeterWood Конечно, почему бы и нет? – erip
@erip, потому что 'reduce' был удален из python 3: https://docs.python.org/3.0/whatsnew/3.0.html#builtins – kazemakase
Если списки малы, как подразумевается, я чувствую, что использование operator
и itertools
что-то вроде этого является применение кувалды к гайке. Аналогично numpy
. Что не так с чистым Python?
result = 1
for s in [ sum(x) for x in zip(*list_) ]:
result *= s
(хотя это было бы намного лучше, если чистый Python был product
встроенный, а также sum
). Кроме того, если вы имеете дело только с парами из 2-х кортежей, то любая форма итерации - кувалдой. Только код
result = (list_[0][0]+list_[1][0])*(list_[0][1]+list_[1][1])
Вы также можете утверждать, что использование 'zip (*)' является кувалдой, когда вы можете просто сделать это с помощью чистого python. Использование 'reduce' просто делает то же самое, что делает ваш код, но более краткий – jamylak
Да,' reduce' - это встроенный, а также 'zip', поэтому просто так, что я лично считаю этот способ более легким для чтения. – nigel222
На самом деле мое предыдущее неверно. 'zip' - это встроенный Python 3, но' сокращение' - нет, поэтому мой способ - это неспециалист Python 2/3. – nigel222
Что произойдет, если есть 3 кортежа: 'list_ = [(1,2), (3,4), (5,6)]'? – erip
@erip '(1 + 3 + 5) * (2 + 4 + 6) = 108' – blackened