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

Fro*_*oyo 6 python list

我的清单是:

a=[1,2,3,4]
Run Code Online (Sandbox Code Playgroud)

现在我希望我的列表是:

a=[-1,-2,-3,-4]
Run Code Online (Sandbox Code Playgroud)

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

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

sol*_*oth 10

使用Python的地图功能

a[:] = map(lambda x: -x, a)
Run Code Online (Sandbox Code Playgroud)

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

map(function,iterable,...)
将函数应用于iterable的每个项目并返回结果列表.如果传递了其他可迭代参数,则函数必须采用那么多参数,并且并行地应用于所有迭代的项.如果一个iterable比另一个短,则假定使用None项扩展.如果function为None,则假定为identity函数; 如果有多个参数,map()返回一个由包含所有迭代中相应项的元组组成的列表(一种转置操作).可迭代参数可以是序列或任何可迭代对象; 结果始终是一个列表.

  • 如果不是用 `a = ...` 赋值而是使用 `a[:] = ...`,那么这 * 将 * 通过切片赋值来改变列表。然后对该列表的其他引用将看到否定值。 (4认同)
  • 这不会修改现有的列表,它会用一个新的列表替换变量`a`,并且答案被否定.(当然这可能是OP可以接受的,但这是一个微妙的差异.) (2认同)

Joh*_*ooy 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
Run Code Online (Sandbox Code Playgroud)

请注意,如果a可以是一个numpy数组,则不需要浪费时间进行转换

In [6]: a = numpy.array(a)

In [7]: timeit -- -a
100000 loops, best of 3: 15.4 us per loop
Run Code Online (Sandbox Code Playgroud)