2013-05-19 3 views
19

Можно ли эмулировать что-то вроде sum() с помощью list comprehension?Python - emulate sum() using list comprehension

Например - мне нужно вычислить произведение всех элементов в списке:

list = [1, 2, 3] 
product = [magic_here for i in list] 

#product is expected to be 6 

код, который делает то же самое:

def product_of(input): 
    result = 1 
    for i in input: 
     result *= i 
    return result 
+0

Возможный дубликат [Что такое функция Python как sum(), но для умножения? product()?] (http://stackoverflow.com/questions/595374/whats-the-python-function-like-sum-but-for-multiplication-product) –

ответ

29

Нет; представление списка создает список, который до тех пор, пока его вход. Вам понадобится один из других функциональных инструментов Python (в частности, reduce()) в fold последовательность в одно значение.

+3

Благодарим вас за первое предложение. Это ответ, который я искал. – StKiller

+0

в Python 3 это модуль [functools] (https://docs.python.org/3/library/functools.html) – xealits

37
>>> from operator import mul 
>>> nums = [1, 2, 3] 
>>> reduce(mul, nums) 
6 

На Python 3 вы будете необходимо указать этот импорт: from functools import reduce

Implementation Artifact

В Python 2.5/2.6 Вы можете использовать vars()['_[1]'] обратиться к списку понимания в настоящее время в стадии строительства. Это horrible и должен никогда не использовать, но это самое близкое к тому, что вы упомянули в вопросе (, используя список comp для подражания продукту).

>>> nums = [1, 2, 3] 
>>> [n * (vars()['_[1]'] or [1])[-1] for n in nums][-1] 
6 
+3

egads, вот только ... Я не событие известно. – joneshf

+2

thats на самом деле просто аккуратный ... Я понятия не имел, что вы можете это сделать (И нет идеи, когда и почему вы когда-нибудь захотите) ... но все равно круто –

+1

+1 для вашего даже подлого подхода к получению результата спасибо mine ;-) – Patrick

9

При составлении списка всегда создается другой список, поэтому нецелесообразно комбинировать их (например, дать один номер). Кроме того, нет способа сделать задание в понимании списка, если только вы не подлый.

Единственный раз, когда я когда-либо видеть, используя списковые как полезный для метода суммы, если вы только хотите, чтобы включить определенные значения в списке, или у вас нет списка номеров:

list = [1,2,3,4,5] 
product = [i for i in list if i % 2 ==0] # only sum even numbers in the list 
print sum(product) 

или другой пример ":

# list of the cost of fruits in pence 
list = [("apple", 55), ("orange", 60), ("pineapple", 140), ("lemon", 80)] 
product = [price for fruit, price in list] 
print sum(product) 

Супер подлый способ сделать задание в списке понимание

dict = {"val":0} 
list = [1, 2, 3] 
product = [dict.update({"val" : dict["val"]*i}) for i in list] 
print dict["val"] # it'll give you 6! 

... но это ужасно :)

+0

+1 для упоминания последнего метода тоже ужасно :) – jamylak

3
>>> reduce(int.__mul__,[1,2,3]) 
6 

C:\Users\Henry>python -m timeit -s "" "reduce(int.__mul__,range(10000))" 
1000 loops, best of 3: 910 usec per loop 

C:\Users\Henry>python -m timeit -s "from operator import mul" "reduce(mul,range(10000))" 
1000 loops, best of 3: 399 usec per loop 

C:\Users\Henry> 
4

Что-то вроде этого:

>>> a = [1,2,3] 
>>> reduce(lambda x, y: x*y, a) 
6 
+1

Я думаю, вы имели в виду x + y not x * y ... хотя оба дают тот же результат для ваших тестовых данных. –

0

Нашли магию на http://code.activestate.com/recipes/436482/.

>>> L=[2, 3, 4] 
>>> [j for j in [1] for i in L for j in [j*i]][-1] 
24 

Это должна быть логика, как в следующем коде.

L=[2, 3, 4] 
P=[] 
for j in [1]: 
    for i in L: 
     for j in [j*i]: 
      P.append(j) 
print(P[-1]) 
+2

Это было отмечено как VLQ. Создает полный список, затем берет только одно значение - настолько сильно неэффективное и не технически «эмулируемое с пониманием списка» (что невозможно по причинам, указанным в верхних ответах). Это может быть «анти-пример», но это так плохо. Я склонен рекомендовать удаление. –

3

Я дополню ответ Игнасио Васкес-Abrams с некоторым кодом, который использует reduce оператор Python.

list_of_numbers = [1, 5, 10, 100] 
reduce(lambda x, y: x + y, list_of_numbers) 

, который также может быть записана в виде

list_of_numbers = [1, 5, 10, 100] 

def sum(x, y): 
    return x + y 

reduce(sum, list_of_numbers) 

Bonus: Python предоставляет эту функциональность встроенного sum функции. Это наиболее читаемое выражение imo.

list_of_numbers = [1, 5, 10, 100] 
sum(list_of_numbers) 
Смежные вопросы