Простейшее:
lst = [1,2,3] # do not shadow `list`
sum(i*v for i, v in enumerate(lst, 1))
# 14
Ваш подход к сокращению завершается неудачно, так как он возвращает int
, который отличается от того, который он ожидает в качестве двух своих входов (tuple
). Вы можете сделать это с помощью:
reduce(lambda a, b: (a[0]*a[1] + b[0]*b[1], 1), enumerate(lst, 1))[0]
# 14
Обратите внимание на (..., 1)
структуру лямбда-выражения, где 1
служит вспомогательным фактором для следующего шага.
Обновление : Поскольку вы действительно хотите получить однородный продукт всех элементов вашей вложенной итерируемой, следующее проще:
from itertools import chain
from operator import mul
reduce(mul, chain(*enumerate(lst, 1)))
# 36