我有一个列表:
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]
最后,可以使用map
,尽管这通常不被赞同。
my_new_list = map(lambda x: x * 5, my_list)
然而,使用map
通常效率较低。根据此问题已删除的回答中ShadowRanger的评论:
之所以“没有人”使用它是因为一般来说,这是一种性能劣化。在CPython中考虑使用
map
的唯一情况是当您使用内置函数作为映射函数时实现C;否则,map
将与更具Python风格的列表推导式或genexpr(它们也更明确地说明了它们是惰性生成器还是急切的list
创建器;在Py3上,如果不将map
调用包装在list
中,则您的代码将无法工作)。如果您正在使用lambda
函数和map
,请停止,您正在错误地使用它。
他在此答复中发表的另一条评论如下:
请不要教人们使用带有
lambda
的map
;一旦您需要一个lambda
,您最好使用列表推导式或生成器表达式。如果您聪明,可以使map
在很多情况下工作,例如在这种情况下,map((5).__mul__,my_list)
,尽管在这种特定情况下,由于字节码解释器对简单的int
数学进行了一些优化,[x * 5 for x in my_list]
更快,而且更符合Pythonic和更简单。
l1
和 l2
作为变量名。 - Remi Guanl1
,比如 l_1
、list_1
等等。这些都比 Num_1
更好。 - Remi Guan一个更快的方法是以向量化的方式进行乘法,而不是循环遍历列表。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的方法,使用列表推导式基本上是最Pythonic的方式。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
的__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)
l = [1, 2, 3, 4, 5]
l[:] = [x * 5 for x in l]
这不需要额外的导入,并且非常符合Pythonic的风格。
l = [x * 5 for x in l]
而不是l[:] = [x * 5 for x in l]
。后者会创建一个新的列表,然后用它来覆盖l
的内容,而不是只重新分配引用,这样更便宜。如果你真的担心空间问题,只需使用循环迭代并进行原地变异即可。 - cs95由于我认为您对Python还不熟悉,让我们走捷径,使用for循环遍历您的列表,并将每个元素相乘并附加到新列表中。
使用for循环
lst = [5, 20 ,15]
product = []
for i in lst:
product.append(i*5)
print product
lst = [5, 20 ,15]
prod = [i * 5 for i in lst]
print prod
使用地图(不是最好的方法,但是解决问题的另一种方法):
list(map(lambda x: x*5,[5, 10, 15, 20, 25]))
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
,最好使用列表推导式或生成器表达式。如果您聪明的话,您可以很多时候在不用 lambda
的情况下使用 map
,例如在这个例子中,您可以使用 map((5).__mul__, my_list)
。尽管在这种特定情况下,由于字节码解释器对简单整数数学运算进行了一些优化,[x * 5 for x in my_list]
更快、更符合 Python 风格和更简单。 - ShadowRanger将my_list
中的每个元素乘以k
:
k = 5
my_list = [1,2,3,4]
result = list(map(lambda x: x * k, my_list))
[5, 10, 15, 20]
var1 = [2,4,6,8,10,12]
#for Integer multiplier us int(x).__mull__ with map
var2 = list( map(int(2).__mul__,var1 ))
#for float multiplier
var2 = list( map(float(2.5).__mul__,var1 ))
我发现使用列表推导式或map时只使用一个对象名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))
map
жЇ”дЅїз”Ёfor-loop
更好。 - Tonymap
更好(如果使用lambda
,则始终如此)。 - ShadowRanger