我有一个清单:
my_list = [1, 2, 3, 4, 5]
如何将每个元素乘以my_list
5?输出应为:
[5, 10, 15, 20, 25]
Answers:
您可以只使用列表理解:
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的方法,那基本上是最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
to中5
的所有项目传递给__mul__
方法,并返回类似迭代器的对象(在python-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)
因为我认为您是Python的新手,所以请做很多事情,使用for循环遍历列表,并将每个元素相乘并将其追加到新列表中。
使用for循环
lst = [5, 20 ,15]
product = []
for i in lst:
product.append(i*5)
print product
使用列表理解,这与使用for循环相同,但更多的是“ pythonic”
lst = [5, 20 ,15]
prod = [i * 5 for i in lst]
print prod
使用map(不是很好,而是解决问题的另一种方法):
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
; 需要的那lambda
一刻,使用列表理解或生成器表达式会更好。如果您很聪明,则可以轻松完成map
工作lambda
,例如,在这种情况下,map((5).__mul__, my_list)
尽管在这种情况下,由于字节码解释器中针对简单int
数学进行的一些优化,[x * 5 for x in my_list]
速度更快,并且更加Pythonic和更简单。
我发现仅使用一个对象名称x使用列表推导或映射很有趣。请注意,每当重新分配x时,其id(x)都会更改,即指向另一个对象。
x = [1, 2, 3]
id(x)
2707834975552
x = [1.5 * x for x in x]
id(x)
2707834976576
x
[1.5, 3.0, 4.5]
list(map(lambda x : 2 * x / 3, x))
[1.0, 2.0, 3.0]
id(x) # not reassigned
2707834976576
x = list(map(lambda x : 2 * x / 3, x))
x
[1.0, 2.0, 3.0]
id(x)
2707834980928
最好的方法是使用列表理解:
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
。