我的列表如下:
a=[1,2,3,4]
现在我希望我的列表是这样的:
a=[-1,-2,-3,-4]
如何在不使用任何循环的情况下改变我的列表?
更新:这可能是一个很大的列表,大约有10000个元素。
我的列表如下:
a=[1,2,3,4]
a=[-1,-2,-3,-4]
如何在不使用任何循环的情况下改变我的列表?
更新:这可能是一个很大的列表,大约有10000个元素。
使用Python的map功能
a[:] = map(lambda x: -x, a)
a
。(当然,这可能对OP来说是可以接受的,但这是一个微妙的区别。) - millimoosea[:] = ...
而不是 a = ...
进行赋值,那么通过切片赋值将直接在原列表上进行修改。这样做会导致其他引用该列表的地方也看到了被取反后的值。 - PaulMcGimport operator
然后 a[:] = map(operator.neg, a)
这样在性能方面更好。 - TMC以下是来自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
list(-1*numpy.array(a))
这取决于你所说的没有任何循环是什么意思。如果你只是想避免显式的循环,比如
a = [ -x for x in a ]
a = map( lambda x:-x, a)
import operator
a = map(operator.neg, a)
你不能没有循环来完成它,但你可以隐藏这个事实。
map(lambda x: -x, a)
不知道为什么不需要循环,也知道没有其他有效的方法来否定一个列表,在这里是我的超级快速解决方案(我对上下文没有了解,所以可能不起作用)
class nlist(object):
def __init__(self, l):
self._list = l
def __getitem__(self, key):
return -self._list[key]
def __iter__(self):
for i in self._list:
yield -i
nl = nlist([1,2,3,4])
for i in nl:
print i
a = [-a[0], -a[1], -a[2], -a[3]]
a
恰好有4个项目的情况。要推广到不同数量的项目......那就需要使用循环。