2011-10-22 73 views
2

比方說,我有一個獲取元組或列表的(乘法)乘積?

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 #thanks SO 
       #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()行爲,但只用於乘法?

感謝大家的幫助。

+1

FWIW,你也可以將總和中的「* 2」。 –

+1

良好的通話。我改變了它。 – Droogans

回答

8

我沒有看到這裏使用索引的任何問題:

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

減少不再存在從蟒蛇3.0+ – Serdalis

+0

+1和'減少(mul,l)'技巧的答案。我同意,第一稿更清晰,我只是尋找一個班輪,以擴大我的列表理解...理解。 ':D' – Droogans

+0

@Serdalis:對,謝謝你的提示。但有'functools.reduce',實際上是一樣的。 – Avaris

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

我在這兩個示例中都看到了太多的左括號。我在2.6中運行我的代碼,它爲我編譯。儘管如此,我會嘗試'for x,y in'。 – Droogans

+0

我修正了我的錯字,你應該修正你的:)這裏有問題'sum(([x [0] ...' – log0

+0

)爲什麼不能像我這樣的noobs來解釋器?好眼睛。 – Droogans

0

我沒有做產品的一個非常簡單的定義;有助於「計算元組產品」

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

可能是一個更優雅的方式來做到這一點,但這似乎工作正常。推測它也可以在列表上工作。

1

或者您可以使用

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

「np.prod」可以採取兩個列表和元組作爲參數。它返回你想要的產品。

+1

儘管這段代碼可以解決這個問題,[包括解釋](http://meta.stackexchange.com/questions/114762/explain-completely-code-based-answers)確實有助於提高帖子的質量。請記住,您將來會爲讀者回答問題,而這些人可能不知道您的代碼建議的原因。 –