在Python中将整数列表的子集相乘

3 投票
5 回答
3226 浏览
提问于 2025-04-15 18:39

假设我有一个包含10个整数的列表,我想把前5个数相乘。有没有什么简单的Python方法可以做到这一点呢?Python在处理列表方面似乎很不错哦 :)

5 个回答

2

当有很多种方法可以做同一件事情时,我会根据代码的可读性或速度来决定使用哪种代码。下面的代码显示了 use_loopuse_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_loopuse_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

编辑:更好的做法

撰写回答