Как перемножить элементы списка python
На этом шаге мы рассмотрим назначение и примеры использования этих функций .
До сих пор мы только выводили элементы последовательностей. Теперь попробуем умножить каждый элемент списка на 2:
arr = [1, 2, 3] for i in arr: i = i * 2 print(arr)
Рис.1. Текст программы и результат выполнения
Архив с файлом можно взять здесь.
Как видно из примера, список не изменился. Переменная i на каждой итерации цикла содержит лишь копию значения текущего элемента списка. Изменить таким способом элементы списка нельзя. Чтобы получить доступ к каждому элементу, можно, например, воспользоваться функцией range () для генерации индексов. Функция range() имеет следующий формат:
range([Начало>, ]Конец>[, Шаг>])
Первый параметр задает начальное значение. Если параметр < Начало >не указан, то по умолчанию используется значение 0. Во втором параметре указывается конечное значение. Следует заметить, что это значение не входит в возвращаемые значения. Если параметр < Шаг >не указан, то используется значение 1. Функция возвращает диапазон — особый объект, поддерживающий итерационный протокол. С помощью диапазона внутри цикла for можно получить значение текущего элемента. В качестве примера умножим каждый элемент списка на 2 (рисунок 2).
arr = [1, 2, 3] for i in range(len(arr)): arr[i] *= 2 print(arr)
Рис.2. Текст программы и результат выполнения
Архив с файлом можно взять здесь.
В этом примере мы получаем количество элементов списка с помощью функции len () и передаем результат в функцию range () . В итоге функция range() возвращает диапазон значений от 0 до len (arr) — 1. На каждой итерации цикла через переменную i доступен текущий элемент из диапазона индексов. Чтобы получить доступ к элементу списка, указываем индекс внутри квадратных скобок. Умножаем каждый элемент списка на 2, а затем выводим результат с помощью функции print () .
Рассмотрим несколько примеров использования функции range() . Выведем числа от 1 до 100:
for i in range(1, 101): print(i)
Можно не только увеличивать значение, но и уменьшать его. Выведем все числа от 100 до 1:
for i in range(100, 0, -1): print(i)
Можно также изменять значение не только на единицу. Выведем все четные числа от 1 до 100:
for i in range(2, 101, 2): print(i)
В Python 3 поведение функция range() возвращает диапазон. Чтобы получить список чисел, следует передать диапазон, возвращенный функцией range() , в функцию list() (рисунок 3).
>>> obj = range(len([1, 2, 3])) >>> obj range(0, 3) >>> obj[0], obj[1], obj[2] # Доступ по индексу (0, 1, 2) >>> obj[0:2] # Получение среза range(0, 2) >>> i = iter(obj) >>> next(i), next(i), next(i) # Доступ с помощью итераторов (0, 1, 2) >>> list(obj) # Преобразование диапазона в список [0, 1, 2] >>> 1 in obj, 7 in obj # Проверка вхождения значения (True, False)
Рис.3. Создание списка чисел на основе диапазона
index (< Значение >) — возвращает индекс элемента, имеющего указанное значение. Если значение не входит в диапазон, возбуждается исключение ValueError . Пример:
>>> obj = range(1, 5) >>> obj.index(1), obj.index(4) (0, 3) >>> obj.index(5) Traceback (most recent call last): File "#11>", line 1, in obj.index(5) ValueError: 5 is not in range
>>> obj = range(1, 5) >>> obj.count(1), obj.count(10) (1, 0)
Функция enumerate (< объект >[, start=0]) на каждой итерации цикла for возвращает кортеж из индекса и значения текущего элемента. С помощью необязательного параметра start можно задать начальное значение индекса. В качестве примера умножим на 2 каждый элемент списка, который содержит четное число (рисунок 4).
arr = [1, 2, 3, 4, 5, 6] for i, elem in enumerate(arr): if elem % 2 == 0: arr[i] *= 2 print(arr)
Рис.4. Пример использования функции enumerate() . Текст программы и результат выполнения
Архив с файлом можно взять здесь.
Функция enumerate() не создает список, а возвращает итератор. С помощью функции next() можно обойти всю последовательность. Когда перебор будет закончен, возбуждается исключение StopIteration :
>>> arr = [1, 2] >>> obj = enumerate(arr, start=2) >>> next(obj) (2, 1) >>> next(obj) (3, 2) >>> next(obj) Traceback (most recent call last): File "", line 1, in next(obj) StopIteration
Кстати, цикл for при работе активно использует итераторы, но делает это незаметно для нас.
На следующем шаге мы рассмотрим цикл while .
Как я могу перемножить все элементы в списке вместе с Python?
Смотрите документацию reduce и operator.mul для объяснения. Вам нужна строка import functools в Python 3+.
Поделиться 12 декабря 2012 в 13:03
Я бы использовал numpy.prod для выполнения задачи:
import numpy as np mylist = [1, 2, 3, 4, 5, 6] result = np.prod(np.array(mylist))
Поделиться 06 сентября 2015 в 17:54
Если вы хотите избежать импорта чего-либо и избежать более сложных областей Python, вы можете использовать простой цикл for:
nums = [1, 2, 3] product = 1 # Don't use 0 here, otherwise, you'll get zero # because anything times zero will be zero. for num in nums: product *= num
Поделиться 12 декабря 2012 в 15:47
В Python 3.8 и выше, модуль стандартной библиотеки math предоставляет .prod для этой цели:
math.prod(iterable, *, start=1)
Метод возвращает произведение значения start (по умолчанию: 1) в размере числа в итерируемом объекте:
import math math.prod([1, 2, 3, 4, 5, 6]) # 720
Если итерируемый объект пустой, это приведет к появлению 1 (или значения start , если они предоставлены).
Поделиться 14 февраля 2019 в 19:32
Вот некоторые измерения производительности с моей машины. Соответствующие в случае, если это выполняется для небольших входов в длительном цикле:
import functools, operator, timeit import numpy as np def multiply_numpy(iterable): return np.prod(np.array(iterable)) def multiply_functools(iterable): return functools.reduce(operator.mul, iterable) def multiply_manual(iterable): prod = 1 for x in iterable: prod *= x return prod sizesToTest = [5, 10, 100, 1000, 10000, 100000] for size in sizesToTest: data = [1] * size timerNumpy = timeit.Timer(lambda: multiply_numpy(data)) timerFunctools = timeit.Timer(lambda: multiply_functools(data)) timerManual = timeit.Timer(lambda: multiply_manual(data)) repeats = int(5e6 / size) resultNumpy = timerNumpy.timeit(repeats) resultFunctools = timerFunctools.timeit(repeats) resultManual = timerManual.timeit(repeats) print(f'Input size: 7d> Repeats: 8d> Numpy: , Functools: , Manual: ')
Результаты:
Input size: 5 Repeats: 1000000 Numpy: 4.670, Functools: 0.586, Manual: 0.459 Input size: 10 Repeats: 500000 Numpy: 2.443, Functools: 0.401, Manual: 0.321 Input size: 100 Repeats: 50000 Numpy: 0.505, Functools: 0.220, Manual: 0.197 Input size: 1000 Repeats: 5000 Numpy: 0.303, Functools: 0.207, Manual: 0.185 Input size: 10000 Repeats: 500 Numpy: 0.265, Functools: 0.194, Manual: 0.187 Input size: 100000 Repeats: 50 Numpy: 0.266, Functools: 0.198, Manual: 0.185
Вы можете видеть, что Numpy немного медленнее на небольших входах, так как он выделяет массив перед выполнением умножения. Также будьте осторожны с переполнением в Numpy.
Поделиться 28 ноября 2017 в 12:44
Numpy имеет функцию prod() , которая возвращает продукт списка, или в этом случае, так как он numpy, он является продуктом массива над заданной осью:
import numpy a = [1,2,3,4,5,6] b = numpy.prod(a)
. или вы можете просто импортировать numpy.prod() :
from numpy import prod a = [1,2,3,4,5,6] b = prod(a)
Поделиться 21 августа 2019 в 05:05
Мне лично нравится это для функции, которая умножает все элементы общего списка вместе:
def multiply(n): total = 1 for i in range(0, len(n)): total *= n[i] print total
Она компактна, использует простые вещи (переменную и цикл for), и мне кажется интуитивной (так выглядит, как я думаю о проблеме, просто возьму одну, умножаю ее, а затем умножаю на следующую и так далее!)
Поделиться 22 июня 2015 в 23:31
Простой способ:
import numpy as np np.exp(np.log(your_array).sum())
Поделиться 13 января 2018 в 20:55
nums = str(tuple([1,2,3])) mul_nums = nums.replace(',','*') print(eval(mul_nums))
Поделиться 09 сентября 2016 в 05:26
Просто хочу добавить однострочный ответ Python 3.8:
def multiply(l): return [b := 1, [b := b * a for a in l]][-1][-1] print(multiply([2, 3, 8, 10]))
- [b := 1, предназначен для определения временной переменной
- . [b := b * a для a в l] предназначен для перебора списка и умножения b на каждый элемент
- . [-1][-1] предназначен для того, чтобы окончательный список был [b, [b * l[0], b * l[1]. b * l[-1]]] . и, таким образом, элемент в конечном положении — это умножение всех элементов в списке.
Поделиться 24 июля 2022 в 11:28
Сегодня я нашел этот вопрос, но заметил, что он не имеет случая, когда в списке есть None . Таким образом, полное решение будет:
from functools import reduce a = [None, 1, 2, 3, None, 4] print(reduce(lambda x, y: (x if x else 1) * (y if y else 1), a))
В случае добавления у нас есть:
print(reduce(lambda x, y: (x if x else 0) + (y if y else 0), a))
Поделиться 07 июля 2016 в 14:58
Один из способов, который вы можете использовать, это math.prod() Например:
import math arr = [1, 2, 3, 4] print(math.prod(arr))
Другой способ — numpy.prod() Это другая библиотека для импорта
import numpy arr = [1, 2, 3, 4] print(numpy.prod(arr))
Поделиться 05 февраля 2023 в 00:04
Как насчет использования рекурсии?
def multiply(lst): if len(lst) > 1: return multiply(lst[:-1])* lst[-1] else: return lst[0]
Поделиться 05 марта 2018 в 08:39
В этой ветке есть много хороших ответов. Если вы хотите перемножить список в реальном производстве, я рекомендую использовать стандартные пакеты numpy или math.
Если вы просто ищете быстрое и грязное решение и не хотите ничего импортировать, вы можете сделать это:
l = [1,2,3,4,5,6] def list_multiply(l): return eval('*'.join(map(str,l))) print(list_multiply(l)) #Output: 720
map(str,l) преобразует каждый элемент в списке в строку. join объединяет каждый элемент в одну строку, разделенную символом * . eval преобразует строку обратно в функцию, которая может оцениваться.
Предупреждение: eval считается опасным использовать, особенно если программа принимает ввод пользователя, потому что пользователь может потенциально ввести любую функцию в код и поставить под угрозу вашу систему.
Перемножение элементов списка

Ребят, столкнулся с такой проблемкой: я знаю что есть такая встроенная функция как sum(), складывающая все что в скобках. Меня интересует следующий вопрос — есть ли какая-нибудь встроенная функция, умножающая все элементы в скобках между собой? Если такой функции нет, то как произвести перемножение этих элементов, используя генератор списков? Заранее, спасибо=)
Лучшие ответы ( 1 )
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:
Перемножение элементов массива
Привет! у меня есть лист состоящий из чисел,подскажите как я могу перемножить все числа друг на.
Перемножение элементов
Здравствуйте, уважаемые форумчане. Помогите, пожалуйста, советом. Проблема в следующем. Имеется.
Перемножение элементов векторов
Даны два вектора А(10) и В(11). Вычислить z=c*d ,где с – количество положительных элементов вектора.
Перемножение элементов массива
Добрый день. Вот, столкнулся с не пониманием того, как перемножить все элементы в массиве. .

Перемножение элементов матриц
Перемножить соответствующие значения первой матрицы находящихся над главной диагональю и значение.
Умножение списка на число
Студент Макс узнал, что в Python умножать можно не только числа, но и другие объекты, например, строку на число:
>>> "Max" * 3 'MaxMaxMax'
«Вау!» — подумал Макс — «А что если умножить список на число?»:
>>> [42, 26] * 3 [42, 26, 42, 26, 42, 26]
Значит можно создать двумерный массив очень кратко и элегантно?
arr = [[]] * 3 arr[0].append(10) arr[1].append(20) arr[2].append(30)
Макс ожидал получить:
[[10], [20], [30]]
[[10, 20, 30], [10, 20, 30], [10, 20, 30]]
Как же так?! Дело в том, что умножение списка на число не копирует сам объект, а лишь ссылку на него. Все три элемента arr ссылаются на один и тот же список. Легко проверить, сравнив адреса объектов:
>>> arr[0] is arr[1] True >>> id(arr[0]), id(arr[1]) (4400840776, 4400840776)

Аналогично в случае классов:
class Dummy: . arr = [Dummy()] * 2 arr[0].x = 10 arr[1].x = 20 print(arr[0].x, arr[0] is arr[1]) # 20 True
А вот с числами, строками и кортежами умножение списка будет работать как ожидал Макс, потому что это неизменяемые типы. Вот такая тонкость, которую нужно знать. Максу следовало бы написать так:
arr = [[] for _ in range(3)] arr[0].append(10) arr[1].append(20) arr[2].append(30) >>> arr [[10], [20], [30]]
Менее кратко, но зато работает без сюрпризов: каждую итерацию создается новый пустой список.
Специально для канала @pyway. Подписывайтесь на мой канал в Телеграм @pyway