【问题标题】:How do I multiply each element in a list by a number?如何将列表中的每个元素乘以一个数字?
【发布时间】:2016-05-12 00:50:36
【问题描述】:

我有一个清单:

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

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

[5, 10, 15, 20, 25]

【问题讨论】:

标签: python list


【解决方案1】:

你可以使用list comprehension:

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 作为变量名。
  • 也不鼓励使用 'l' 作为变量,因为字母 'l' 和数字 1 很容易混淆。我在 OP 的原始问题中使用了变量,我相信您对问题的编辑弊大于利。
  • 如果你觉得我的编辑不好,你可以编辑问题来改进它。另外,我们可以选择其他变量而不是l1,例如l_1list_1等。这些都比Num_1好。
【解决方案2】:

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

【讨论】:

  • 我对为什么 numpy 方法“快得多”感兴趣?您能否详细说明或指出一些资源?我不确定什么是矢量化。
  • @AerinmundFagelson 这里-> stackoverflow.com/questions/35091979/…
  • @Kasramvd 该链接不正确。该链接讨论了 vectorization 作为单指令多数据的不同含义(像 GPU 一样一次将操作应用于许多数据)。在 NumPy 的上下文中,vectorization 是指使用快速预编译的 C 循环对数据序列进行操作,而不是纯 Python。
【解决方案3】:

你可以像这样就地做:

 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 的内容,而不是仅仅重新分配更便宜的引用。如果您真的担心空间问题,只需使用循环进行迭代并就地变异。
【解决方案4】:

因为我认为您是 Python 新手,所以让我们从长远来看,使用 for 循环遍历您的列表,然后将每个元素相乘并将其附加到一个新列表中。

使用for循环

lst = [5, 20 ,15]
product = []
for i in lst:
    product.append(i*5)
print product

使用列表推导,这也与使用 for-loop 相同,但更“pythonic”

lst = [5, 20 ,15]

prod = [i * 5 for i in lst]
print prod

【讨论】:

  • “漫长的道路”如何更好?它更长——因此更难阅读——而不是更容易写。
  • 好吧,也许你对我的标题有错误的印象,我从来没有说过它更好,只是想告诉他如何在不理解的情况下做到这一点。因为根据我刚接触python时的经验,我无法轻松掌握理解的概念。
  • 哦,好的。我不能直接联系,因为我是从函数式语言开始的。
  • 我明白了。我编辑了答案以包括有效的方法。
【解决方案5】:

使用地图(不是那么好,但解决问题的另一种方法):

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

另外,如果你碰巧使用的是 numpy 或 numpy 数组,你可以使用这个:

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

【讨论】:

  • 为什么不使用 lambda 而不是定义 timesfive 函数?
【解决方案6】:
from functools import partial as p
from operator import mul
map(p(mul,5),my_list)

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

【讨论】:

  • 您可以在没有导入语句的情况下使用 lambda 表达式来做到这一点。此外,您的 sn-p 返回一个地图对象,除非将其转换为列表,否则该对象是无用的。 list(map(lambda x: 5*x, my_list)).
  • @castle-bravo 它的用处取决于你需要用它做什么......有很多方法可以完成这个解决方案(正如我提到的......)
  • 请不要教人们将maplambda一起使用;当您需要lambda 时,最好使用列表理解或生成器表达式。如果你很聪明,你可以map 在没有lambdas 的情况下工作很多,例如在这种情况下,map((5).__mul__, my_list),尽管在这种特殊情况下,由于字节码解释器对简单的int 数学进行了一些优化,[x * 5 for x in my_list] 更快,并且更 Pythonic 和更简单。
【解决方案7】:

my_list 中的每个元素乘以k

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

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

【讨论】:

    【解决方案8】:

    我发现使用列表推导式或只有一个对象名称 x 的映射很有趣。 请注意,每当x is reassigned 时,它的 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
    

    【讨论】:

      【解决方案9】:

      最好的方法是使用列表推导:

      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 所要求的。
      猜你喜欢
      • 2016-05-23
      • 1970-01-01
      • 2023-03-19
      • 2012-09-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-15
      相关资源
      最近更新 更多