У меня есть список:
my_list = [1, 2, 3, 4, 5]
Как я могу умножить каждый элемент my_list
на 5? Результат должен быть:
[5, 10, 15, 20, 25]
У меня есть список:
my_list = [1, 2, 3, 4, 5]
Как я могу умножить каждый элемент my_list
на 5? Результат должен быть:
[5, 10, 15, 20, 25]
Ответы:
Вы можете просто использовать понимание списка:
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]
l1
и в l2
качестве имени переменной.
l1
такие, как l_1
, list_1
и т. Д. Все они лучше, чем Num_1
.
Гораздо более быстрый подход - выполнить умножение векторизованным способом, а не перебирать список. 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)
Вы можете сделать это на месте так:
l = [1, 2, 3, 4, 5]
l[:] = [x * 5 for x in l]
Это не требует дополнительного импорта и очень питонично.
l = [x * 5 for x in l]
кончить l[:] = [x * 5 for x in l]
. Последний создает новый список, а затем использует его для перезаписи содержимого, l
а не просто переназначает ссылку, что дешевле. Если вас действительно беспокоит пространство, просто повторяйте цикл и изменяйте на месте.
Поскольку я думаю, что вы новичок в 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
С картой (не так хорошо, но другой подход к проблеме):
list(map(lambda x: x*5,[5, 10, 15, 20, 25]))
также, если вы используете массивы numpy или numpy, вы можете использовать это:
import numpy as np
list(np.array(x) * 5)
from functools import partial as p
from operator import mul
map(p(mul,5),my_list)
это один из способов, которым вы могли бы это сделать ... ваш учитель, вероятно, знает гораздо менее сложный способ, который, вероятно, был рассмотрен в классе
map
с lambda
; в тот момент, когда вам понадобится a lambda
, вам было бы лучше с пониманием списка или выражением генератора. Если вы умны, вы можете сделать map
работу без lambda
са много, например в данном случае map((5).__mul__, my_list)
, хотя в данном случае, благодаря некоторым оптимизаций в интерпретатор байт кода для простой int
математики, [x * 5 for x in my_list]
быстрее, а также быть более Pythonic и простой .
Лучший способ - использовать понимание списка:
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]
map
лучше чемfor-loop
.