在python中将一个整数列表的子集相乘

时间:2010-01-29 21:57:24

标签: python

假设我有一个10个整数的列表,我想要将前5个乘以的结果。有这样做的pythonic方式吗? Python似乎很适合列表:)

5 个答案:

答案 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_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程序员来说都是可读的。然而,在品味问题上,我认为过于自以为是不值得。选择你最喜欢的,只要保持一致。

PS。从Python 3+开始,reduce不再是内置函数,但可以通过functools.reduce访问。

答案 3 :(得分:0)

使用reduce:

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