Получить (мультипликативный) произведение кортежа или списка? - PullRequest
6 голосов
/ 22 октября 2011

Допустим, у меня есть

class Rectangle(object):                                               
def __init__(self, length, width, height=0):                                                   
    self.l = length                                               
    self.w = width                                                
    self.h = height                                               
    if not self.h:                                                     
        self.a = self.l * self.w                                       
    else:                                                              
        from itertools import combinations                            
        args = [self.l, self.w, self.h]                                
        self.a = sum(x*y for x,y in combinations(args, 2)) * 2
                 # original code:
                 # (self.l * self.w * 2) + \                            
                 # (self.l * self.h * 2) + \                            
                 # (self.w * self.h * 2)                                
        self.v = self.l * self.w * self.h                                           

Что каждый берет в строку 12?

self.a = sum(x*y for x,y in combinations(args, 2)) * 2 

Я слышал, что явных ссылок на индексы списка следует избегать.

Есть ли функция, которую я могу использовать, которая действует как sum(), но только для умножения?

Спасибо всем за помощь.

Ответы [ 4 ]

10 голосов
/ 22 октября 2011

Я не вижу здесь никаких проблем с использованием индексов:

sum([x[0] * x[1] for x in combinations(args, 2)])

Если вы действительно хотите их избежать, вы можете сделать:

sum([x*y for x,y in combinations(args, 2)])

Но, если честноЯ бы предпочел вашу закомментированную версию.Это ясно, читаемо и более явно.И вы на самом деле не получите много, написав это, как описано выше, только для трех переменных.

Есть ли функция, которую я могу использовать, которая действует как sum (), но только для умножения?

Встроенный?Нет. Но вы можете получить эту функциональность довольно просто с помощью следующего:

In : a=[1,2,3,4,5,6]

In : from operator import mul

In : reduce(mul,a)
Out: 720
3 голосов
/ 07 марта 2017

В качестве альтернативы вы можете использовать

np.sum(np.prod(x) for x in combinations(args, 2))

'np.prod' может принимать оба списка и кортеж в качестве параметра. Возвращает продукт, который вы хотите.

1 голос
/ 22 октября 2011

вы можете сделать:

from operator import mul
sum(reduce(mul,combinations(args, 2)))

но я думаю, что это просто делает вещи менее читабельными.

Однако перед суммированием вы фактически строите список умножения sum([...]).

self.a = sum([(x[0] * x[1] * 2) for x in combinations(args, 2)])

Это не нужно, просто сделайте:

self.a = sum(x * y * 2 for x,y in combinations(args, 2))
0 голосов
/ 11 февраля 2012

Я сделал очень простое определение продукта; полезно для "вычисления произведения кортежа"

def product(tuple1):
    """Calculates the product of a tuple"""
    prod = 1
    for x in tuple1:
        prod = prod * x
    return prod

Может быть, это более элегантный способ сделать это, но, похоже, это работает хорошо. Предположительно, это сработало бы и со списком.

...