Уменьшить с перечислением Python - PullRequest
0 голосов
/ 16 марта 2020

Я пытаюсь получить произведение списка, где каждый элемент умножается на его индекс +1. Я пытался с помощью метода Reduce и перечислить

value = reduce(lambda a, b: (a[0]+1)*a[1]*b[1], enumerate(list))

, но он дает TypeError: 'int' object is not subscriptable. Возможно ли сделать это в одну строку?

Editv2

пример списка [1,2,3]

желаемый вывод list[0]*1 * list[1]*2 * list[2]*3 = 36

Ответы [ 3 ]

4 голосов
/ 16 марта 2020

Простейшее:

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
1 голос
/ 16 марта 2020

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

Создать новый список, где число с индексом i равно i*list[i], индексирование начинается с 1:

>>> new_list = [a*b for a, b in enumerate(list, 1)]
>>> new_list
[1, 4, 9]

и умножьте свой новый список:

>>> reduce((lambda x, y: x*y), new_list)
36

В одной строке:

>>> reduce((lambda x, y: x*y), [a*b for a, b in enumerate(list, 1)])
36

Надеюсь, это помогло:)

Примечание: Ответ отредактировано с учетом изменений ОП.

0 голосов
/ 16 марта 2020
ans = sum(i * x for i, x in enumerate(list, 1))

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

...