在python中修改没有任何循环的大型列表

时间:2011-12-08 20:10:08

标签: python list

我的清单是:

a=[1,2,3,4]

现在我希望我的列表是:

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

如何在不使用任何循环的情况下以这种方式更改列表?

更新:这可能是一个大型列表,大约10000个元素。

8 个答案:

答案 0 :(得分: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

答案 1 :(得分:7)

使用Python的map功能

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

以下是上述链接中的地图功能说明:

  

地图(功能,可迭代,......)
  将函数应用于iterable的每个项目并返回一个列表   结果。如果传递了其他可迭代参数,则函数必须   拿出那么多参数并应用于所有的项目   并行迭代。如果一个迭代比另一个迭代短,那么   假设用无项扩展。如果函数是None,则   假设身份函数;如果有多个参数,map()   返回一个由包含相应项的元组组成的列表   来自所有迭代(一种转置操作)。可迭代的   参数可以是序列或任何可迭代对象;结果是   总是一个清单。

答案 2 :(得分:4)

您可以使用numpy库:

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

答案 3 :(得分:3)

这取决于你没有任何循环的意思。如果你只是想避免像

这样的显式循环
a = [ -x for x in a ]

你可以使用map循环功能。

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

答案 4 :(得分:3)

import operator
a = map(operator.neg, a)

答案 5 :(得分:1)

如果没有循环你就无法做到,但你可以隐藏这个事实。

map(lambda x: -x, a)

答案 6 :(得分:1)

不知道为什么不需要循环的确切原因,并且知道没有其他有效的方法来否定列表这里是我的超快速解决方案(我不了解上下文所以这可能不起作用)

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

答案 7 :(得分:0)

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

现在的问题是,只有当a恰好有4个项目时,这才有效。概括为不同数量的项目......那就是循环的用途。