Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在python中修改不带任何循环的大列表_Python_List - Fatal编程技术网

在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