2016-01-04 2 views
4
list_ = [(1, 2), (3, 4)] 

Что такое питонический способ получения суммы упорядоченных пар из внутренних кортежей и умножения сумм? Для приведенного выше примера:Работа с вложенными списками в Python

(1 + 3) * (2 + 4) = 24 
+1

Что произойдет, если есть 3 кортежа: 'list_ = [(1,2), (3,4), (5,6)]'? – erip

+0

@erip '(1 + 3 + 5) * (2 + 4 + 6) = 108' – blackened

ответ

7

Например:

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() 
+0

Это работает, но это Pythonic? –

+0

@PeterWood Конечно, почему бы и нет? – erip

+2

@erip, потому что 'reduce' был удален из python 3: https://docs.python.org/3.0/whatsnew/3.0.html#builtins – kazemakase

0

Если списки малы, как подразумевается, я чувствую, что использование 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]) 
+1

Вы также можете утверждать, что использование 'zip (*)' является кувалдой, когда вы можете просто сделать это с помощью чистого python. Использование 'reduce' просто делает то же самое, что делает ваш код, но более краткий – jamylak

+0

Да,' reduce' - это встроенный, а также 'zip', поэтому просто так, что я лично считаю этот способ более легким для чтения. – nigel222

+0

На самом деле мое предыдущее неверно. 'zip' - это встроенный Python 3, но' сокращение' - нет, поэтому мой способ - это неспециалист Python 2/3. – nigel222

Смежные вопросы