2013-08-24 24 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