在 Python 中无循环修改大列表
我的列表是:
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()会返回一个包含所有可迭代对象对应元素的元组列表(这有点像转置操作)。可迭代对象可以是一个序列或者任何可迭代的东西;结果总是一个列表。