我编写了以下Python代码:
numbers = [42, 4224, 42422424, -250]
products = numbers*157
products
这将导致以下输出:
42,
4224,
42422424,
-250,
42,
4224,
42422424,
-250,
42,
4224,
42422424,
-250,
等:此顺序重复了几次,可能是157次。
为什么此代码不将每个数组元素乘以157?这应该是:
[6594, 663168, 6660320568, -39250]
将列表乘以任何常量c
将使列表中的元素重复c
次。
[为了更好地了解这里发生的情况,您应该先将列表乘以一个较小的常量,最后逐步达到157。让我们先将列表乘以1:]]
products = numbers*1 print(products) [42, 4224, 42422424, -250]
我们可以看到将列表乘以1只会将我们发送回原始列表,因为元素仅在列表中包含一次。接下来,我们将列表乘以2:
products = numbers*2 print(products) [42, 4224, 42422424, -250, 42, 4224, 42422424, -250]
我们可以看到元素在同一列表中重复了两次。您可以自行增加常数,以观察重复次数的增加。
正如其他人所建议的,您可以简单地使用列表理解
或numpy数组检索所需的输出:方法1:列表理解
products = [i*157 for i in numbers] print(products) [6594, 663168, 6660320568, -39250]
列表理解本质上是编写循环的简写,在我们的情况下,该循环将每个单独的元素乘以157。
方法2:numpy数组
products = np.array(numbers)*157 print(products) array([6594, 663168, 6660320568, -39250])
Numpy是用于数组处理和数据处理的模块。您可以阅读有关numpy here的好处的更多信息。
性能测试
我将在下面包括一些性能差异。这也是一个很好的示例,包括将列表乘以常数并将列表的元素乘以常数。
>>> timeit.timeit('[i*157 for i in numbers]', 'numbers=[42, 4224, 42422424, -250]', number=1000000) 0.35015837100013414 >>> timeit.timeit('numbers*157', 'import numpy as np;numbers=np.array([42, 4224, 42422424,-250])', number=1000000) 0.639420188000031 >>> timeit.timeit('[i*157 for i in numbers]', 'numbers=[42, 4224, 42422424,-250]*500', number=1000000) 91.96342155899993 >>> timeit.timeit('numbers*157', 'import numpy as np;numbers=np.array([42, 4224, 42422424,-250]*500)', number=1000000) 1.3476544480001849
通常,对于较大的类似数组的数据,numpy数组的性能要优于普通的Python列表。但是,在某些情况下,Python列表的性能要优于numpy数组,您可以阅读有关here的更多信息。
为什么此代码不将每个数组元素乘以157?
您想通过numpy数组实现。在普通列表数组中,执行numbers * 157
将执行您获得的重复。对于您想要的输出,