2013-08-24 27 views
0

我試圖找出一種pythonic,描述性方法來乘以一個數字列表,並將其提高到相應的數字,只要該數字不是零。下面是我在做什麼,在這裏我硬編碼的因素[2,3,5]列表的簡單版本:Python:如果n不爲零,則優化因子到n的因子鏈的乘積

>>> import operator 
>>> ## numbers could be written as lambda factor_list, power_list: [[factor_list[i]... 
>>> numbers = lambda x, y, z: [[2, 3, 5][i] ** [x, y, z][i] for i in xrange(3) 
     if [x, y, z][i] != 0] 
>>> product = lambda numbers: reduce(operator.mul, numbers, 1) 
>>> numbers(1, 0, 0) 
[2] 
>>> product(numbers(1, 0, 0)) 
2 
>>> numbers(1, 2, 3) 
[2, 9, 125] 
>>> product(numbers(1, 2, 3)) 
2250 

我可以用一個for循環這樣寫的功能,如果功率值等於0,則簡單地避免任何附加乘法;例如if n !=0: product *= f ** n並根據需要循環。我覺得列表理解和lambda是作爲一個潛在更好的選擇。

+0

你有問題嗎? –

+0

你是否有理由避開這種繁殖?有可能它不會產生可測量的差異,或者由於額外的檢查和分支而使速度變慢。 – delnan

+0

@Jon編寫代碼有很多種方法,我想發佈我的代碼,看看我是否錯過了python的質量,這將是..更好的pythonic。我發現每次找出其中的一個,我的編碼就會變得更好。 – Cole

回答

2

這應該是Python的不足:

>>> from operator import mul 

>>> base = [2, 3, 5] 
>>> powers = [1, 0, 0] 
>>> l = [n**p for n, p in zip(base, powers) if p != 0] 
[2] 
>>> reduce(mul, l, 1) 
2 

隨着發電機:

>>> from itertools import izip 

>>> powers = [1, 2, 3] 
>>> numbers = (n**p for n, p in izip(base, powers) if p != 0) 
>>> reduce(mul, numbers , 1) 
2250