Имя переменной, которое начинается с заглавной буквы, не является Pythonic. И это списки, а не числа. Поэтому я предлагаю использовать l1и в l2качестве имени переменной.
Казимир Кристал
4
Использование l в качестве переменной также не рекомендуется, поскольку букву l и число 1 легко спутать. Я использовал переменные в исходном вопросе OP, и я считаю, что ваше изменение вопроса принесло больше вреда, чем пользы.
Александр
1
Если вы считаете, что мои правки плохие, вы можете отредактировать вопрос, чтобы улучшить его. Кроме того, мы можем выбрать другие переменные, а не l1такие, как l_1, list_1и т. Д. Все они лучше, чем Num_1.
Казимир Кристал
26
Гораздо более быстрый подход - выполнить умножение векторизованным способом, а не перебирать список. Numpy уже предоставил очень простой и удобный способ для этого, который вы можете использовать.
Обратите внимание, что это не работает с собственными списками 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 * 5899 µs ± 4.98 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
Меня интересует, почему метод numpy «невероятно быстрее»? Не могли бы вы уточнить или указать мне на некоторые ресурсы? Я не уверен, что такое векторизация.
@Kasramvd Эта ссылка неверна. В ссылке обсуждается другое значение векторизации как «одна инструкция-несколько данных» (применение операции ко многим данным одновременно, как это делают графические процессоры). В контексте NumPy векторизация означает использование быстрых предварительно скомпилированных циклов C для работы с последовательностью данных, а не чистого Python.
Вдобавок: эта концепция называется составлением списка, если вы хотите найти дополнительную информацию о ней.
Майкл
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 * 5for 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, вы можете использовать это:
Почему бы не использовать лямбда вместо определения функции 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))
defmap_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))
Это просто берет принятый ответ и превращает его в функцию. Вероятно, вы могли бы сделать это с более чем половиной ответов на SO, но это ничего не добавляет и не то, что запросил OP.
map
лучше чемfor-loop
.map
(и всегда лучше, еслиmap
потребуетсяlambda
).Ответы:
Вы можете просто использовать понимание списка:
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
; в тот момент, когда вам понадобится alambda
, вам было бы лучше с пониманием списка или выражением генератора. Если вы умны, вы можете сделатьmap
работу безlambda
са много, например в данном случаеmap((5).__mul__, my_list)
, хотя в данном случае, благодаря некоторым оптимизаций в интерпретатор байт кода для простойint
математики,[x * 5 for x in my_list]
быстрее, а также быть более Pythonic и простой .Умножение каждого элемента
my_list
наk
:k = 5 my_list = [1,2,3,4] result = list(map(lambda x: x * k, my_list))
в результате чего:
[5, 10, 15, 20]
источник
Лучший способ - использовать понимание списка:
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]
источник