假设我有一个10个整数的列表,我想要将前5个乘以的结果。有这样做的pythonic方式吗? Python似乎很适合列表:)
答案 0 :(得分:9)
import operator
l = [1, 2, 3, 4, 5, 6, 7, 8, 9]
print reduce(operator.mul, [v for (k, v,) in enumerate(l) if k < 5])
>> 120
编辑:更好的方法
print reduce(operator.mul, l[:5])
>> 120
答案 1 :(得分:4)
很多方法。这是一个:
>>> a = range(1,10)
>>> reduce(lambda x,y: x*y, a[:5])
120
答案 2 :(得分:2)
当有很多方法可以做某事时,我会转向可读性或速度等标准来决定使用哪种代码。以下是一些代码,表明use_loop
和use_reduce
在速度方面大致相关(至少对于测试的值!)
import operator
import itertools
a=range(1,1000)
def use_loop(a,n):
result=1
for num in a[:n]:
result*=num
return result
def use_reduce(a,n):
return reduce(operator.mul, a[:n])
def use_reduce_lambda(a,n):
return reduce(lambda x,y: x*y, a[:n])
def use_islice_loop(a,n):
result=1
for num in itertools.islice(a,n):
result*=num
return result
def use_islice_reduce(a,n):
return reduce(operator.mul, itertools.islice(a,n))
if __name__=='__main__':
n=50
print(use_loop(a,n))
print(use_reduce(a,n))
print(use_reduce_lambda(a,n))
print(use_islice_loop(a,n))
print(use_islice_reduce(a,n))
以下是时间安排结果:
% python -mtimeit -s"import test" "test.use_loop(test.a,50)"
10000 loops, best of 3: 16.1 usec per loop
% python -mtimeit -s"import test" "test.use_reduce(test.a,50)"
100000 loops, best of 3: 16.3 usec per loop
% python -mtimeit -s"import test" "test.use_islice_loop(test.a,50)"
10000 loops, best of 3: 19.6 usec per loop
% python -mtimeit -s"import test" "test.use_islice_reduce(test.a,50)"
10000 loops, best of 3: 19.2 usec per loop
% python -mtimeit -s"import test" "test.use_reduce_lambda(test.a,50)"
10000 loops, best of 3: 32.1 usec per loop
至少对于测试的a
(1000)和n
(50)的值,itertools.islice
似乎没有帮助提高性能。 use_reduce_lambda
显着慢于使用use_reduce
的表亲operator.mul
。但是,导入operator
所需的时间不包括在测试中。
由于use_loop
和use_reduce
似乎同样快,我建议使用reduce
因为它的简短惯用代码应该对大多数python程序员来说都是可读的。然而,在品味问题上,我认为过于自以为是不值得。选择你最喜欢的,只要保持一致。
PS。从Python 3+开始,reduce
不再是内置函数,但可以通过functools.reduce
访问。
答案 3 :(得分:0)
reduce(lambda x, y: x*y, mylist[:5])
例如,
>>> reduce(lambda x,y:x*y, range(1,5))
24
reduce()
函数将给定函数(此处为乘法)应用于列表的前两项,从而将它们减少为一个项目。这样做直到列表中只有一个项目。此项目作为结果返回。这种表示法源自函数式语言。
result=1
for i in mylist[:5]:
result*=i
e.g,
>>> result=1
>>> for i in range(1,5):
result*=i
>>> result
24
这是在列表的所有项目上聚合某些功能的最常用方法;它类似于Java或C的方式。
答案 4 :(得分:0)
这是一个简单的功能,可以做你想要的。
def multiply(args):
x= 1
for arg in args:
x*= arg
return x
l = [1, 2, 3, 4, 5, 6, 7, 8, 9]
multiply(l)
>>>362880
multiply(l[:5])
>>>120