Как перемножить элементы списка python
Перейти к содержимому

Как перемножить элементы списка python

  • автор:

Как перемножить элементы списка 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 считается опасным использовать, особенно если программа принимает ввод пользователя, потому что пользователь может потенциально ввести любую функцию в код и поставить под угрозу вашу систему.

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

Author24 — интернет-сервис помощи студентам

Ребят, столкнулся с такой проблемкой: я знаю что есть такая встроенная функция как 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)

Диаграмма: все элементы arr указывают на один и тот же список.

Аналогично в случае классов:

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 ��

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *