在 Python 中无循环修改大列表

8 投票
8 回答
10993 浏览
提问于 2025-04-17 08:00

我的列表是:

a=[1,2,3,4]

现在我想把我的列表变成:

a=[-1,-2,-3,-4]

我该怎么做才能不使用任何循环来改变我的列表呢?

更新:这个列表可能很大,大约有10000个元素。

8 个回答

4

你可以使用numpy这个库:

list(-1*numpy.array(a))
9

这里有一些来自ipython的快速测试数据

In [1]: a=range(10000)

In [2]: import numpy 

In [3]: timeit [-i for i in a]
1000 loops, best of 3: 576 us per loop

In [4]: timeit map(lambda i:-i, a)
1000 loops, best of 3: 1.68 ms per loop

In [5]: timeit list(-1*numpy.array(a))
100 loops, best of 3: 2.53 ms per loop

注意,如果a可以是一个numpy数组,你就不需要浪费时间去转换它了

In [6]: a = numpy.array(a)

In [7]: timeit -- -a
100000 loops, best of 3: 15.4 us per loop
14

使用Python的map功能

a[:] = map(lambda x: -x, a)

下面是上面链接中对map函数的描述:

map(function, iterable, ...)
这个函数会把你给的function应用到可迭代对象中的每一个元素上,然后返回一个结果列表。如果你传入了多个可迭代对象,function就需要接收相同数量的参数,并且会同时处理所有可迭代对象中的元素。如果其中一个可迭代对象比其他的短,它会用None来填充。假如function是None,那么就会用一个默认的身份函数;如果有多个参数,map()会返回一个包含所有可迭代对象对应元素的元组列表(这有点像转置操作)。可迭代对象可以是一个序列或者任何可迭代的东西;结果总是一个列表。

撰写回答