迭代时编辑列表(pythonic方式!)

Cla*_*sen 0 python list

所以,我知道如何做到这一点,但它看起来并不像pythonic.这样做有更干净的方法吗?

arr = list(range(10))
print(arr)
for n in range(len(arr)):
    # Perform som operation on the element that changes the value "in place"
    arr[n] += 1
print(arr)
Run Code Online (Sandbox Code Playgroud)

输出(这就是我想要的):

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
Run Code Online (Sandbox Code Playgroud)

Mar*_*ers 5

你可以使用列表理解:

arr = [i + 1 for i in arr]
Run Code Online (Sandbox Code Playgroud)

这会产生一个新的清单; 在上面的例子中,我将结果反弹为相同的名称.

如果您对列表有多个引用并且需要就地更改它(因此其他引用会看到更改),请分配标识slice([:])以更新列表的所有索引,而不是重新绑定名称:

arr[:] = [i + 1 for i in arr]
Run Code Online (Sandbox Code Playgroud)

这首先创建一个新的列表对象,然后Python足够聪明,可以看到两个列表的大小相同,并且在再次释放第二个列表之前只复制元素.

在这种情况下,您甚至可以使用生成器表达式来避免创建额外的列表:

arr[:] = (i + 1 for i in arr)
Run Code Online (Sandbox Code Playgroud)

这会将原始元素移到一边为新元素腾出空间,但是没有为此创建新的Python列表对象.这应该是一个更高效的内存.

  • @Clausen:在内存受限的环境中你应该使用生成器表达式. (2认同)
  • @Clausen:很高兴你发现不止一个答案有用!不幸的是,您可以将"已接受"标记授予其中一个答案.选择你认为最有帮助的那个(如果你不能选择的话,根本不选一个,也很好). (2认同)