Умножение элементов списка справа и слева

Рейтинг: 0Ответов: 2Опубликовано: 24.01.2023

Написал функцию которая должна брать элемент списка, и возвращать список такого же размера, где каждый элемент равен произведению элементов справа и элементов слева.

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'), дайте подсказку как правильно помножить значения.

Ответы

▲ 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]
▲ 1

numbers[0: i-1] * numbers[i+1:] на втором примере (со списком из 9) даст два списка, допустим [9, 9] и [9, 9]. Понятное дело, что будет указанная ошибка, т.к. нельзя совершить операцию [9, 9] * [9, 9]. Поэтому нужно или идти по списку, поочередно умножая все элементы, пропустив текущий, или, как предложено в комментарии – перемножить все элементы, а потом делить произведение на текущий элемент (если он не 0).