Как мне умножить каждый элемент в списке на число?


92

У меня есть список:

my_list = [1, 2, 3, 4, 5]

Как я могу умножить каждый элемент my_listна 5? Результат должен быть:

[5, 10, 15, 20, 25]

2
Использование mapлучше чем for-loop.
Тони

9
И понимание списка (почти всегда) лучше, чемmap (и всегда лучше, если mapпотребуется lambda).
ShadowRanger

Ответы:


133

Вы можете просто использовать понимание списка:

my_list = [1, 2, 3, 4, 5]
my_new_list = [i * 5 for i in my_list]

>>> print(my_new_list)
[5, 10, 15, 20, 25]

Обратите внимание, что понимание списка, как правило, является более эффективным способом создания forцикла:

my_new_list = []
for i in my_list:
    my_new_list.append(i * 5)

>>> print(my_new_list)
[5, 10, 15, 20, 25]

В качестве альтернативы вот решение, использующее популярный пакет Pandas:

import pandas as pd

s = pd.Series(my_list)

>>> s * 5
0     5
1    10
2    15
3    20
4    25
dtype: int64

Или, если вам просто нужен список:

>>> (s * 5).tolist()
[5, 10, 15, 20, 25]

Имя переменной, которое начинается с заглавной буквы, не является Pythonic. И это списки, а не числа. Поэтому я предлагаю использовать l1и в l2качестве имени переменной.
Казимир Кристал

4
Использование l в качестве переменной также не рекомендуется, поскольку букву l и число 1 легко спутать. Я использовал переменные в исходном вопросе OP, и я считаю, что ваше изменение вопроса принесло больше вреда, чем пользы.
Александр

1
Если вы считаете, что мои правки плохие, вы можете отредактировать вопрос, чтобы улучшить его. Кроме того, мы можем выбрать другие переменные, а не l1такие, как l_1, list_1и т. Д. Все они лучше, чем Num_1.
Казимир Кристал

26

Гораздо более быстрый подход - выполнить умножение векторизованным способом, а не перебирать список. Numpy уже предоставил очень простой и удобный способ для этого, который вы можете использовать.

>>> import numpy as np
>>> 
>>> my_list = np.array([1, 2, 3, 4, 5])
>>> 
>>> my_list * 5
array([ 5, 10, 15, 20, 25])

Обратите внимание, что это не работает с собственными списками Python. Если вы умножите число на список, он будет повторять элементы как размер этого числа.

In [15]: my_list *= 1000

In [16]: len(my_list)
Out[16]: 5000

Если вам нужен чистый подход, основанный на Python, использование понимания списка - это, по сути, самый питонический способ.

In [6]: my_list = [1, 2, 3, 4, 5]

In [7]: [5 * i for i in my_list]
Out[7]: [5, 10, 15, 20, 25]

Помимо понимания списка, в качестве чисто функционального подхода вы также можете использовать встроенную map()функцию следующим образом:

In [10]: list(map((5).__mul__, my_list))
Out[10]: [5, 10, 15, 20, 25]

Этот код передает все элементы в пределах my_listдо 5«S __mul__методы и возвращает итератор типа объекта (в питоне-3.x). Затем вы можете преобразовать итератор в список, используя list()встроенную функцию (в Python-2.x вам это не нужно, потому mapчто по умолчанию возвращается список).

тесты:

In [18]: %timeit [5 * i for i in my_list]
463 ns ± 10.6 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

In [19]: %timeit list(map((5).__mul__, my_list))
784 ns ± 10.7 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

In [20]: %timeit [5 * i for i in my_list * 100000]
20.8 ms ± 115 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)

In [21]: %timeit list(map((5).__mul__, my_list * 100000))
30.6 ms ± 169 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)


In [24]: arr = np.array(my_list * 100000)

In [25]: %timeit arr * 5
899 µs ± 4.98 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

Меня интересует, почему метод numpy «невероятно быстрее»? Не могли бы вы уточнить или указать мне на некоторые ресурсы? Я не уверен, что такое векторизация.
Aerinmund Fagelson,

1
@AerinmundFagelson Здесь -> stackoverflow.com/questions/35091979/…
Kasravnd

@Kasramvd Эта ссылка неверна. В ссылке обсуждается другое значение векторизации как «одна инструкция-несколько данных» (применение операции ко многим данным одновременно, как это делают графические процессоры). В контексте NumPy векторизация означает использование быстрых предварительно скомпилированных циклов C для работы с последовательностью данных, а не чистого Python.
xjcl


19

Вы можете сделать это на месте так:

 l = [1, 2, 3, 4, 5]
 l[:] = [x * 5 for x in l]

Это не требует дополнительного импорта и очень питонично.


Вдобавок: эта концепция называется составлением списка, если вы хотите найти дополнительную информацию о ней.
Майкл

1
Я бы предпочел l = [x * 5 for x in l]кончить l[:] = [x * 5 for x in l]. Последний создает новый список, а затем использует его для перезаписи содержимого, lа не просто переназначает ссылку, что дешевле. Если вас действительно беспокоит пространство, просто повторяйте цикл и изменяйте на месте.
cs95

6

Поскольку я думаю, что вы новичок в Python, давайте проделаем долгий путь, пройдемся по вашему списку с помощью цикла for, умножим и добавим каждый элемент в новый список.

использование цикла for

lst = [5, 20 ,15]
product = []
for i in lst:
    product.append(i*5)
print product

используя понимание списка, это то же самое, что и использование цикла for, но более "питоническое"

lst = [5, 20 ,15]

prod = [i * 5 for i in lst]
print prod

Чем лучше "длинный путь"? Он длиннее - поэтому его труднее читать - и писать не легче.
lirtosiast 03

1
ладно, возможно, у тебя неправильное впечатление о моем названии, и я никогда не говорил, что это лучше, просто пытаюсь показать ему, как это сделать, не используя понимание. потому что, по моему опыту, когда я был новичком в Python, я не мог легко понять концепцию понимания.
wasp8898 03

Ох, ну ладно. Я не могу общаться напрямую, потому что начинал с функциональных языков.
lirtosiast 03

Понятно, ну вот. Я отредактировал ответ, чтобы также включить эффективный способ сделать это.
wasp8898 03

4

С картой (не так хорошо, но другой подход к проблеме):

list(map(lambda x: x*5,[5, 10, 15, 20, 25]))

также, если вы используете массивы numpy или numpy, вы можете использовать это:

import numpy as np
list(np.array(x) * 5)

Почему бы не использовать лямбда вместо определения функции timesfive?
Vimanyu

2
from functools import partial as p
from operator import mul
map(p(mul,5),my_list)

это один из способов, которым вы могли бы это сделать ... ваш учитель, вероятно, знает гораздо менее сложный способ, который, вероятно, был рассмотрен в классе


Вы можете сделать это без операторов импорта, используя лямбда-выражение. Кроме того, ваш сниппет возвращает объект карты, который бесполезен, если он не приведен в список. список (карта (лямбда x: 5 * x, my_list)).
Castle-Bravo

@ castle-bravo его полезность зависит от того, что вам нужно с ним делать ... есть много способов достичь этого решения (как я уже упоминал ...)
Джоран Бизли

4
Пожалуйста, не учите людей использовать mapс lambda; в тот момент, когда вам понадобится a lambda, вам было бы лучше с пониманием списка или выражением генератора. Если вы умны, вы можете сделать mapработу без lambdaса много, например в данном случае map((5).__mul__, my_list), хотя в данном случае, благодаря некоторым оптимизаций в интерпретатор байт кода для простой intматематики, [x * 5 for x in my_list]быстрее, а также быть более Pythonic и простой .
ShadowRanger

1

Умножение каждого элемента my_listна k:

k = 5
my_list = [1,2,3,4]
result = list(map(lambda x: x * k, my_list))

в результате чего: [5, 10, 15, 20]


-1

Лучший способ - использовать понимание списка:

def map_to_list(my_list, n):
# multiply every value in my_list by n
# Use list comprehension!
    my_new_list = [i * n for i in my_list]
    return my_new_list
# To test:
print(map_to_list([1,2,3], -1))

Возвращает: [-1, -2, -3]


Это просто берет принятый ответ и превращает его в функцию. Вероятно, вы могли бы сделать это с более чем половиной ответов на SO, но это ничего не добавляет и не то, что запросил OP.
Александр
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.