Подтвердить что ты не робот

Как эмулировать sum(), используя понимание списка?

Можно ли эмулировать что-то вроде sum() с помощью понимания списка?

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

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
4b9b3361

Ответ 1

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

Ответ 2

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

В Python 3 вам нужно будет добавить этот импорт: from functools import reduce

Артефакт реализации

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

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

Ответ 3

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

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

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!

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

Ответ 4

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

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

Ответ 5

Я дополняю ответ Ignacio Vazquez-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)

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

list_of_numbers = [1, 5, 10, 100]
sum(list_of_numbers)

Ответ 6

>>> 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>

Ответ 7

Нашел магию 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])

Ответ 8

Этого можно достичь, используя лямбду с пониманием списка. Поскольку мы не можем присвоить значение в понимании списка, мы используем лямбду

Решение:

>>> (lambda number_list, sum=0:[sum for number in number_list for sum in [sum + number]][-1])([1, 2, 3, 4, 5])
>>> 15

Ответ 9

Начиная с Python 3.8 и введением выражений присваивания (PEP 572) (:= оператор), мы можем использовать и увеличивать переменную в пределах понимания списка и таким образом сокращать список до суммы его элементов:

total = 0
[total := total + x for x in [1, 2, 3, 4, 5]]
# 15

Это:

  • Инициализирует переменную total до 0
  • Для каждого элемента total увеличивается на текущий зацикленный элемент (total := total + x) с помощью выражения присваивания