获取元组或列表的(乘法)乘积?

时间:2011-10-22 19:11:53

标签: python standard-library

假设我有一个

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(),但仅用于乘法?

感谢大家的帮助。

5 个答案:

答案 0 :(得分:10)

我认为在这里使用索引没有任何问题:

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

答案 1 :(得分:3)

或者你可以使用

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

'np.prod'可以将列表和元组作为参数。它会返回您想要的产品。

答案 2 :(得分:2)

由于这是Google的最佳搜索结果,因此我将仅添加自python 3.8以来的内容:

from math import prod
t = (5, 10)
l = [2, 100]
prod(t) # 50
prod(l) # 200

答案 3 :(得分:1)

你可以这样做:

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))

答案 4 :(得分:0)

我确实对产品做了一个非常简单的定义;有助于“计算元组的乘积”

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

可能是一种更优雅的方式,但这似乎工作正常。据推测,它也可以在列表中工作。