在python中修改不带任何循环的大列表
我的名单是:在python中修改不带任何循环的大列表,python,list,Python,List,我的名单是: a=[1,2,3,4] 现在我希望我的列表是: a=[-1,-2,-3,-4] 不使用任何循环,如何以这种方式更改列表 更新:这可能是一个很大的列表,大约有10000个元素。使用Python的功能 a[:] = map(lambda x: -x, a) 下面是上面链接中的map函数说明: 映射(函数、iterable等) 将函数应用于iterable的每个项,并返回 结果。若传递了其他iterable参数,则函数必须 取那么多参数,并应用于所有 它是平行的。如果一个表比另一个
a=[1,2,3,4]
现在我希望我的列表是:
a=[-1,-2,-3,-4]
不使用任何循环,如何以这种方式更改列表
更新:这可能是一个很大的列表,大约有10000个元素。使用Python的功能
a[:] = map(lambda x: -x, a)
下面是上面链接中的map函数说明:
映射(函数、iterable等)将函数应用于iterable的每个项,并返回 结果。若传递了其他iterable参数,则函数必须 取那么多参数,并应用于所有 它是平行的。如果一个表比另一个表短,它就是 假定扩展为无项。如果函数为None,则 假设恒等函数;如果有多个参数,则map() 返回由包含相应项的元组组成的列表 从所有的易位(一种转置操作)。难以忍受的 参数可以是序列或任何iterable对象;结果是 总是一张清单
您可以使用numpy库:
list(-1*numpy.array(a))
如果没有循环,则无法执行此操作,但可以隐藏事实
map(lambda x: -x, a)
这取决于你所说的没有任何循环的意思。如果您只是想避免像这样的显式循环
a = [ -x for x in a ]
您可以使用map函数,这将为您循环
a = map( lambda x:-x, a)
现在的问题是,只有当
a
正好有4个项目时,这才有效。推广到不同数量的项目…这就是循环的用途。一些来自ipython的快速而肮脏的基准测试
import operator
a = map(operator.neg, a)
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
不知道为什么不需要循环的确切原因,也不知道没有其他有效的方法来否定列表,这是我的超快速解决方案(我不知道上下文,所以这可能不起作用)
这不会修改现有列表,它将用答案为否定的新列表替换变量
a
。(当然,OP可能会接受这一点,但这是一个微妙的区别。)它是否比循环或列表理解快得多?如果您不使用a=…
赋值,而是使用a[:]=…
,那么这将通过执行切片赋值来更改列表。然后,对该列表的其他引用将看到否定的值。@PaulMcGuire感谢我不知道,并相应地更新了我的答案。Alex Martelli在回答这个问题时向我说明了这一点:由于时间限制,有什么特殊原因不循环吗。。循环需要很多时间。我必须修改多达10000个整数的列表,为什么你认为超过10000个整数的单个循环是你的瓶颈问题?这真的不会花很长时间。请注意,使用“map”和“lambda”的答案将比仅仅循环慢。仅仅是“不循环”本身并不会使代码更快。可能是你应该想办法不进行否定,所以可能是你能告诉自己为什么要进行否定,以及在这种情况下为什么循环较慢吗?请注意,与使用map
的其他答案不同,这个答案可能比显式循环更快。另一个map
答案都使用了lambda
,这将使它们的速度变慢。不幸的是,Python和numpy之间的转换开销使得它不适合加速这样的单次操作
In [6]: a = numpy.array(a)
In [7]: timeit -- -a
100000 loops, best of 3: 15.4 us per loop
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