Как найти произведение чисел в массиве python

Я приведу не очень практичное, но красивое решение в одну строку. Оно не использует eval, побочные эффекты при работе со списком или именованные функции.

Если именованные функции разрешены, то решение может выглядеть так:

def p(a):
    if a:
        return a[0] * p(a[1:])
    return 1

print(p([1, 2, 3, 4, 5]))

Нам оно не подходит, так именованная функция требует минимум две строки для определения и вызова. Лямбду можно определить и вызвать в одной строке, но есть трудность в создании рекурсивной лямбды. Синтаксис Python разрешает такой трюк:

p = (lambda a: a[0] * p(a[1:]) if a else 1); print(p([1, 2, 3, 4, 5]))

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

p = lambda f, a: a[0] * f(f, a[1:]) if a else 1
print(p(p, [1, 2, 3, 4, 5]))

Кажется мы ничего не выиграли: всё равно два оператора и глобальная переменная p. Однако сделан очень важный шаг – тело лямбды не использует глобальные переменные. Глобальная переменная используется в операторе print. Избавимся от неё:

p = lambda f, a: a[0] * f(f, a[1:]) if a else 1
y = lambda f, a: f(f, a)
print(y(p, [1, 2, 3, 4, 5]))

Стало только хуже: три строки и две глобальные переменные. Зато каждая глобальная переменная задействована только один раз. Делаем подстановку:

print((lambda f, a: f(f, a))(lambda f, a: a[0] * f(f, a[1:]) if a else 1, [1, 2, 3, 4, 5]))

Читается тяжело, но задача решена в одну строку без глобальных имён и волшебных вызовов eval.

P.S. Читайте Fixed-point combinator чтобы узнать откуда пошло это решение.

P.P.S. Красивое утверждение: программу любой сложности можно записать в функциональном стиле не определив ни одной глобальной переменной, включая имена функций.

P.P.P.S. Не пытайтесь повторить это дома.

Given a list, print the value obtained after multiplying all numbers in a list. 

Examples: 

Input :  list1 = [1, 2, 3] 
Output :
Explanation: 1*2*3=6 

Input : list1 = [3, 2, 4] 
Output : 24 

Method 1: Traversal

Initialize the value of the product to 1(not 0 as 0 multiplied with anything returns zero). Traverse till the end of the list, multiply every number with the product. The value stored in the product at the end will give you your final answer.

Below is the Python implementation of the above approach:  

Python

def multiplyList(myList):

    result = 1

    for x in myList:

        result = result * x

    return result

list1 = [1, 2, 3]

list2 = [3, 2, 4]

print(multiplyList(list1))

print(multiplyList(list2))

Time complexity: O(n), where n is the number of elements in the list.
Auxiliary space: O(1),

Method 2: Using numpy.prod()

We can use numpy.prod() from import numpy to get the multiplication of all the numbers in the list. It returns an integer or a float value depending on the multiplication result.

Below is the Python3 implementation of the above approach:  

Python3

import numpy

list1 = [1, 2, 3]

list2 = [3, 2, 4]

result1 = numpy.prod(list1)

result2 = numpy.prod(list2)

print(result1)

print(result2)

Output: 
 

6
24 

Time complexity: O(n), where n is the length of the input lists. 
Auxiliary space: O(1). 

Method 3 Using lambda function: Using numpy.array

Lambda’s definition does not include a “return” statement, it always contains an expression that is returned. We can also put a lambda definition anywhere a function is expected, and we don’t have to assign it to a variable at all. This is the simplicity of lambda functions. The reduce() function in Python takes in a function and a list as an argument. The function is called with a lambda function and a list and a new reduced result is returned. This performs a repetitive operation over the pairs of the list.

Below is the Python3 implementation of the above approach:  

Python3

from functools import reduce

list1 = [1, 2, 3]

list2 = [3, 2, 4]

result1 = reduce((lambda x, y: x * y), list1)

result2 = reduce((lambda x, y: x * y), list2)

print(result1)

print(result2)

Time complexity: O(n) – where n is the length of the longer list.
Auxiliary space: O(1) – the memory used is constant, as no extra data structures are create.

Method 4 Using prod function of math library: Using math.prod

Starting Python 3.8, a prod function has been included in the math module in the standard library, thus no need to install external libraries.

Below is the Python3 implementation of the above approach:  

Python3

import math

list1 = [1, 2, 3]

list2 = [3, 2, 4]

result1 = math.prod(list1)

result2 = math.prod(list2)

print(result1)

print(result2)

Output: 
 

6
24 

Time complexity: O(n), where n is the length of the input list. 
Auxiliary space: O(1), as the program only uses a fixed amount of memory to store the input lists and the output variables.

Method 5: Using mul() function of operator module. 

First we have to import the operator module then using the mul() function of operator module multiplying the all values in the list. 

Python3

from operator import*

list1 = [1, 2, 3]

m = 1

for i in list1:

    m = mul(i, m)

print(m)

Time complexity:

The program contains a single for loop that iterates through each element in the input list. Therefore, the time complexity of the program is O(n), where n is the length of the input list.
 

Auxiliary space:

The program uses a constant amount of auxiliary space throughout its execution. Specifically, it only creates four variables: list1, m, i, and the imported mul function from the operator module. The space required to store these variables does not depend on the size of the input list, and therefore the auxiliary space complexity of the program is O(1), which is constant.
 

Method 6: Using traversal by index

Python3

def multiplyList(myList) :

    result = 1

    for i in range(0,len(myList)):

        result = result * myList[i]

    return result

list1 = [1, 2, 3]

list2 = [3, 2, 4]

print(multiplyList(list1))

print(multiplyList(list2))

Time complexity: O(n), where n is the length of the input list. 

Auxiliary space: O(1), as the program uses a single variable to store the result and does not use any additional data structure. 

Method 7: Using itertools.accumulate

Python

from itertools import accumulate

list1 = [1, 2, 3]

list2 = [3, 2, 4]

result1 = list(accumulate(list1, (lambda x, y: x * y)))

result2 = list(accumulate(list2, (lambda x, y: x * y)))

print(result1[-1])

print(result2[-1])

Output:

6
24

The time complexity is O(n), where n is the length of the input list.

The auxiliary space is also O(n) 

Method 8: Using the recursive function 

The function product_recursive() takes a list of numbers as input and returns the product of all the numbers in the list, using a recursive approach.

The steps for this function are:

  1. Check if the list is empty. If it is, return 1 (the product of an empty list is defined as 1).
  2. If the list is not empty, recursively call the product_recursive() function on the rest of the list (i.e., all the elements except for the first one) and multiply the result by the first element of the list.
  3. Return the product obtained from step 2.
     

Python3

def product_recursive(numbers):

    if not numbers:

        return 1

    return numbers[0] * product_recursive(numbers[1:])

list1 = [1, 2, 3]

product = product_recursive(list1)

print(product) 

list2 = [3, 2, 4]

product = product_recursive(list2)

print(product) 

The time complexity of this function is O(n), where n is the number of elements in the list. This is because the function needs to perform n recursive calls, one for each element in the list. 
The space complexity is also O(n) because the function creates n recursive calls on the call stack. This means that for large lists, the function can quickly use up a lot of memory, which can cause the program to crash or slow down significantly.

Method: Using  reduce() and the mul() function’s

One approach to solve this problem is to use the built-in reduce() function from the functools module, which can apply a function to an iterable in a cumulative way. We can use the operator.mul() function to multiply the elements together.

Here are the steps and code:

  1. Import the reduce() function and mul() function from the functools and operator modules, respectively.
  2. Define the input list.
  3. Apply the reduce() function to the list, using mul() as the function to apply.
  4. Print the result.

Python3

from functools import reduce

from operator import mul

list1 = [1, 2, 3]

result = reduce(mul, list1)

print(result)

Time complexity: O(n)
Auxiliary space: O(1)

Last Updated :
25 Apr, 2023

Like Article

Save Article

Заполните массив числами, введёнными пользователем с клавиатуры. Вычислить сумму и произведение элементов массива. Вывести сам массив, полученную сумму и произведение его элементов. Разбор задачи на языке python.

Алгоритм решения задачи на python

1) Установите переменную, которая будет хранить сумму, и присвойте ей 0, а переменную, в которой будет храниться произведение, присвойте 1.

2) Используйте for для решения задачи

3) Выведите сумму и произведение.

Код для нахождения суммы и произведения массива на python

a = [0]*10
s = 0
m = 1
for i in range(10):
    a[i] = float(input('Введите число '))
    s += a[i]
    m *= a[i]
print(a)
print('Сумма = ',s)
print('Произведение = ',m)

Полезные ссылки :

Ставьте лайки, рассказывайте друзьям и обязательно комментируйте! =)

3,3 K

Комментировать пост…Комментировать…

О сообществе

Время чтения 3 мин.

Чтобы найти произведение массива в Python, используйте метод numpy.prod(). Он возвращает произведение массива, предоставленного данной осью.

Содержание

  1. Что такое функция np.prod() в Python?
  2. Синтаксис
  3. Параметры
  4. Возвращаемое значение
  5. Примеры
  6. Передача пустого массива
  7. Присвоение dtype = целое число без знака
  8. Передача параметра Initial

numpy.prod() в Python — это метод математической библиотеки numpy, который возвращает произведение элементов массива по заданной оси. По умолчанию для оси установлено значение «None», таким образом вычисляется произведение всех элементов в данном массиве. Функция prod() принимает до семи аргументов, некоторые могут быть необязательными.

Синтаксис

numpy.prod(arr1, axis=None, dtype=None, out=None, keepdims=<no value>, initial=<no value>, where=<no value>)

Параметры

  1. arr1: это параметр, который следует интерпретировать как array_like, действующий как входные данные.
  2. axis: [Необязательный параметр] Это может быть целое число, кортеж целых чисел или None. Этот параметр указывает оси, по которым должно выполняться изделие. Для отрицательной оси произведение вычисляется от последней до первой оси. Произведение выполняется по всем указанным для кортежа целым числам.
  3. dtype: [Необязательный параметр] Указывает тип возвращаемого массива. Он также устанавливает накопитель, в котором должны быть перемножены элементы входного массива arr1. Если arr1 не имеет целочисленного dtype меньшей точности, чем целое число платформы по умолчанию, используется dtype arr1. Если arr1 знаковый, то dtype представляет собой целое число платформы или целое число без знака той же точности, если arr1 беззнаковое.
  4. out:(ndarray) [Необязательный параметр]: указывает альтернативный выходной массив, в который должен быть помещен результирующий продукт. Должен иметь ту же форму, что и ожидаемый результат.
  5. keepdims:(bool) [Необязательный параметр] Если установлено значение true, уменьшенные оси остаются в качестве измерений с размером 1 в результате. Это делается для того, чтобы результирующая трансляция корректно относилась к массиву, взятому на вход.
  6. Initial:(скаляр) [Необязательный параметр]: это начальное значение продукта.
  7. where:(array_like of bool) [Необязательный параметр]: это элементы, которые должны быть включены в продукт.

Возвращаемое значение

Произведение массива элементов по заданной оси. Возвращает ссылку на массив out, если указано.

Метод np.prod() в Python

Примечание: если входной массив пуст, то этот метод возвращает нейтральный элемент: 1

Примеры

Следующий код демонстрирует использование метода prod().

import numpy as np

arr1 = [5, 6]

arr2 = np.prod(arr1)

print(arr2)

Выход

В следующем примере демонстрируется случай, когда используется двумерный массив.

import numpy as np

arr1 = [[4,5],[1,3]]

arr2 = np.prod(arr1)

print(arr2)

Выход

Передача пустого массива

Если мы передадим пустой массив в функцию prod() в Python, она вернет 1 в качестве вывода. Следующий код демонстрирует случай, когда в качестве входного массива передается пустой массив.

import numpy as np

arr1 = []

arr2 = np.prod(arr1)

print(arr2)

Выход

Если мы передаем пустой массив, то выход продукта пустого массива равен 1.

Присвоение dtype = целое число без знака

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

import numpy as np

arr1 = [5, 22, 13]

arr2 = np.prod(arr1, dtype=np.uint8)

print(arr2.dtype == np.uint8)

arr1 = np.array([5, 22, 13], dtype=np.uint8)

print(np.prod(arr1).dtype == np.uint)

print(np.prod(arr1).dtype == np.uint8)

Выход

Следующий код демонстрирует использование параметра where для указания элементов, которые следует включить в продукт.

import numpy as np

arr1 = [10, 2, np.nan]

arr2 = np.prod(arr1, where=[True, True, False])

print(arr2)

Выход

Передача параметра Initial

В следующем примере показано использование параметра Initial для запуска продукта со значением, отличным от 1.

import numpy as np

arr1 = [1, 3, 4]

arr2 = np.prod(arr1, initial=100)

print(arr2)

Выход

Следующий код демонстрирует применение этого метода в простом контексте программирования.

На фабрике некоторым рабочим выплачивается заработная плата в зависимости от количества отработанных дней в месяце. На заводе есть разные отделы. Как менеджер, рассчитайте общую заработную плату, которая должна быть выплачена рабочим через месяц после просмотра данных в формате [[количество рабочих, дневная заработная плата, количество дней], …] для n отделов фабрики.

См. следующий код.

import numpy as np

n = int(input(“Number of departments: “))

alldata = []

for i in range(3*n):

    alldata.append(int(input()))

deptwisedata = np.reshape(alldata,(n, 3))

print(deptwisedata, “n”)

dept_total = np.prod(deptwisedata, axis=1)

print(“Department total: “, dept_total, “n”)

grandtotal = sum(dept_total)

print(“Grand total: “, grandtotal, “n”)

Выход

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

Test Case 1:

->python3 example8.py

Number of departments: 2

5

4

6

6

1

2

[[5 4 6]

[6 1 2]]

Department total:  [120  12]

Grand total:  132

Test Case 2:

Number of departments: 3

6

1

10

5

2

6

6

1

10

[[ 6  1 10]

[ 5  2  6]

[ 6  1 10]]

Department total:  [60 60 60]

Grand total:  180

Я приведу не очень практичное но красивое решение в одну строку. Оно не использует eval, побочные эффекты при работе со списком или именованные функции.

Если именованные функции разрешены, то решение может выглядеть так:

def p(a):
    if a:
        return a[0] * p(a[1:])
    return 1

print(p([1, 2, 3, 4, 5]))

Нам оно не подходит, так именованная функция требует минимум две строки для определения и вызова. Лямбду можно определить и вызвать в одной строке, но есть трудность в создании рекурсивной лямбды. Синтаксис Python разрешает такой трюк:

p = (lambda a: a[0] * p(a[1:]) if a else 1); print(p([1, 2, 3, 4, 5]))

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

p = lambda f, a: a[0] * f(f, a[1:]) if a else 1
print(p(p, [1, 2, 3, 4, 5]))

Кажется мы ничего не выиграли: всё равно два оператора и глобальная переменная p. Однако сделан очень важный шаг – тело лямбды не использует глобальные переменные. Глобальная переменная используется в операторе print. Избавимся от неё:

p = lambda f, a: a[0] * f(f, a[1:]) if a else 1
y = lambda f, a: f(f, a)
print(y(p, [1, 2, 3, 4, 5]))

Стало только хуже: три строки и две глобальные переменные. Зато каждая глобальная переменная задействована только один раз. Делаем подстановку:

print((lambda f, a: f(f, a))(lambda f, a: a[0] * f(f, a[1:]) if a else 1, [1, 2, 3, 4, 5]))

Читается тяжело, но задача решена в одну строку без глобальных имён и волшебных вызовов eval.

P.S. Читайте Fixed-point combinator чтобы узнать откуда пошло это решение.

P.P.S. И есть очаровательное утверждение: программу любой сложность можно записать в функциональном стиле не определив ни одной глобальной переменной, включая имена функций.

P.P.P.S. Не пытайтесь повторить это дома.

Добавить комментарий