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


Answers:


138

您可以只使用列表理解:

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]

以大写字母开头的变量名称不是Pythonic。它们是列表,而不是数字。所以我建议使用l1l2作为变量名。
卡西米尔水晶

4
也不建议将“ l”用作变量,因为字母“ l”和数字1容易混淆。我在OP的原始问题中使用了变量,并且我相信您对问题的编辑弊大于利。
亚历山大

1
如果您认为我的编辑不正确,可以编辑问题以进行改进。此外,我们还可以选择其它的变量,而不是l1l_1list_1等等,这些都优于Num_1
卡西米尔水晶

26

一种极快的方法是以矢量化的方式进行乘法运算,而不是遍历列表。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_listto中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)

我对为什么numpy方法“非常快”感兴趣?您能否详细说明或指出一些资源?我不确定什么是向量化。
Aerinmund Fagelson


@Kasramvd该链接不正确。该链接讨论了向量化的不同含义,即单指令多数据(就像GPU一样,一次对多个数据进行操作)。在NumPy的上下文中,向量化是指使用快速的预编译C循环对数据序列进行操作,而不是对纯Python进行操作。
xjcl


19

您可以像这样就地进行:

 l = [1, 2, 3, 4, 5]
 l[:] = [x * 5 for x in l]

这不需要额外的导入,并且非常Python化。


另外:如果您要查找有关列表的更多信息,则此概念称为列表理解
迈克尔

1
我宁愿l = [x * 5 for x in l]结束l[:] = [x * 5 for x in l]。后者创建一个新列表,然后使用它来覆盖的内容,l而不是仅仅重新分配比较便宜的引用。如果您实际上担心空间,只需循环并在适当位置进行变异即可。
cs95 '20

6

因为我认为您是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

在任何方面,“漫长的路途”如何更好?它更长,因此更难阅读,而且写起来也不容易。
lirtosiast '16

1
好的,也许您对我的头衔印象不对,而我从来没有说过会更好,只是试图向他展示如何在不理解的情况下做到这一点。因为以我刚接触python时的经验,我无法轻松理解理解的概念。
ellaRT

哦好的。我不能直接联系,因为我是从功能语言开始的。
lirtosiast '16

我知道了,很好。我编辑了答案,其中还包括有效的方法。
ellaRT'Feb 3'16

4

使用map(不是很好,而是解决问题的另一种方法):

list(map(lambda x: x*5,[5, 10, 15, 20, 25]))

另外,如果碰巧正在使用numpy或numpy数组,则可以使用以下命令:

import numpy as np
list(np.array(x) * 5)

为什么不使用lambda而不是定义5倍函数?
Vimanyu

3
from functools import partial as p
from operator import mul
map(p(mul,5),my_list)

是您可以做到的一种方法...您的老师可能知道一种可能在课堂上讲过的简单得多的方法


您可以在不使用lambda表达式的import语句的情况下进行操作。此外,您的代码段还返回一个地图对象,除非将其强制转换为列表,否则它是无用的。list(map(lambda x:5 * x,my_list))。
castle-bravo

@ castle-bravo它的用处取决于您需要使用它的方式...实现此解决方案的方法有很多(正如我所提到的...)
Joran Beasley

4
请不要教人使用maplambda; 需要的那lambda一刻,使用列表理解或生成器表达式会更好。如果您很聪明,则可以轻松完成map工作lambda,例如,在这种情况下,map((5).__mul__, my_list)尽管在这种情况下,由于字节码解释器中针对简单int数学进行的一些优化,[x * 5 for x in my_list]速度更快,并且更加Pythonic和更简单。
ShadowRanger

1

乘以每个元件在my_listk

k = 5
my_list = [1,2,3,4]
result = list(map(lambda x: x * k, my_list))

导致: [5, 10, 15, 20]


0

我发现仅使用一个对象名称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

-1

最好的方法是使用列表理解:

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]


这只是接受的答案并将其转换为函数。您可能会用一半以上的SO响应来做到这一点,但它不会添加任何内容,也不是OP所要求的。
亚历山大
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.