在Python中将整数列表的子集相乘
假设我有一个包含10个整数的列表,我想把前5个数相乘。有没有什么简单的Python方法可以做到这一点呢?Python在处理列表方面似乎很不错哦 :)
5 个回答
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 程序员都能很容易理解。不过在个人喜好方面,我觉得不必太过坚持。选择你最喜欢的方式,只要保持一致就好。
附注:在 Python 3 及以上版本中,reduce
不再是内置函数,但可以通过 functools.reduce
来使用。
4
有很多种方法。这里介绍一种:
>>> a = range(1,10)
>>> reduce(lambda x,y: x*y, a[:5])
120
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
编辑:更好的做法