Умножение элементов списка справа и слева
Написал функцию которая должна брать элемент списка, и возвращать список такого же размера, где каждый элемент равен произведению элементов справа и элементов слева.
def product_list(numbers: list) -> list:
new_list = []
for i in range(0, len(numbers) - 1):
numbers[i] = numbers[0: i-1] * numbers[i+1:] # беру элементы слева jn i и умножаю на элементы справа
return print(new_list)
product_list([12, 20]) # == [20, 12]
product_list([9, 9, 9, 9, 9]) # == [6561, 6561, 6561, 6561, 6561]
product_list([1, 5, 2]) # == [10, 2, 5]
product_list([4, 3, 9]) # == [27, 36, 12]
product_list([4, 5, 2, 19, 8, 80]) # == [121600, 97280, 243200, 25600, 60800, 6080,]
product_list([2, 8, 22, 76, 9]) # == [120384, 30096, 10944, 3168, 26752,]
Выдает ошибку что срезы нельзя между собой умножать (TypeError: can't multiply sequence by non-int of type 'list'), дайте подсказку как правильно помножить значения.
Ответы (2 шт):
numbers[0: i-1] * numbers[i+1:] на втором примере (со списком из 9) даст два списка, допустим [9, 9] и [9, 9]. Понятное дело, что будет указанная ошибка, т.к. нельзя совершить операцию [9, 9] * [9, 9]. Поэтому нужно или идти по списку, поочередно умножая все элементы, пропустив текущий, или, как предложено в комментарии – перемножить все элементы, а потом делить произведение на текущий элемент (если он не 0).
Можно воспользоваться методом reduce из библиотеки functools
from functools import reduce
a = [3, 4, 5, 6]
result = [reduce(lambda x, y: x*y, a[:idx] + a[idx+1:]) for idx, value in enumerate(a)]
print(result)
[120, 90, 72, 60]