如何将列表中的每个元素乘以一个数字?

新手上路,请多包涵

我有一个清单:

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

如何将 my_list 中的每个元素乘以 5?输出应该是:

 [5, 10, 15, 20, 25]

原文由 DJ bigdawg 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 2.5k
2 个回答

您可以只使用 列表理解

 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 的运行速度将等于或慢于更 Pythonic 的 listcomp 或 Genexpr(它们也更明确地说明它们是惰性生成器还是急切的 list 创建者;在 Py3 ,如果不包装 map 调用 list ,您的代码将无法工作)。如果你正在使用 maplambda 函数,停止,你做错了。

他的另一条评论发布 到此回复

请不要教人们使用 maplambda ;当您需要 lambda 时,最好使用列表理解或生成器表达式。如果你很聪明,你可以在没有 lambda 的情况下使 map 工作很多,例如在这种情况下, map((5).__mul__, my_list) 尽管在这种特殊情况下,感谢一些字节码解释器中针对简单 int math, [x * 5 for x in my_list] 的优化更快,并且更 Pythonic 和更简单。

原文由 Alexander 发布,翻译遵循 CC BY-SA 4.0 许可协议

一种速度非常快的方法是以向量化方式进行乘法运算,而不是循环遍历列表。 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 的迭代器对象(in)。然后,您可以使用 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)

原文由 Mazdak 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题