Умножение подмножества списка целых чисел в Python - PullRequest
3 голосов
/ 30 января 2010

Допустим, у меня есть список из 10 целых чисел, и я хочу получить результат умножения первых 5 вместе.Есть ли питонский способ сделать это?Python отлично работает со списками:)

Ответы [ 5 ]

9 голосов
/ 30 января 2010
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
4 голосов
/ 30 января 2010

много путей. Вот один из них:

>>> a = range(1,10)
>>> reduce(lambda x,y: x*y, a[:5])
120
2 голосов
/ 30 января 2010

Когда есть много способов что-то сделать, я обращаюсь к таким критериям, как удобочитаемость или скорость, чтобы решить, какой код использовать. Вот некоторый код, который предполагает, что 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.

0 голосов
/ 08 марта 2013

Это простая функция, которая будет делать то, что вы хотите.

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
0 голосов
/ 30 января 2010

Использование приведения:

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

например,

>>> result=1
>>> for i in range(1,5):
    result*=i
>>> result
24

Это наиболее общий способ объединения некоторой функции по всем элементам списка; Это похоже на то, как это было бы сделано Java или C.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...