就地替换python中列表中所有元素的出现

lif*_*nce 10 python replace list in-place

假设我有一个清单:

myl = [1, 2, 3, 4, 5, 4, 4, 4, 6]
Run Code Online (Sandbox Code Playgroud)

什么是最有效的,最简单的Python的方式就地(双加权)替换所有出现的444

我也很好奇为什么没有standard办法做到这一点(特别是,当strings有一个非就地 replace方法)?

use*_*ica 22

myl[:] = [x if x != 4 else 44 for x in myl]
Run Code Online (Sandbox Code Playgroud)

使用列表推导执行非就地替换,然后如果您真的想要更改原始列表,则将新值切片分配到原始列表中.

  • 唯一的问题是我们必须构建一个新的列表并用新的列表替换旧的列表.我的版本在这里效率可能很高.必须'timeit`并确认. (2认同)
  • @bereal:[`list_ass_slice`](http://hg.python.org/cpython/file/55fed3eae14b/Objects/listobject.c#l613)对它分配给切片的东西调用`PySequence_Fast`,这会杀死任何好处使用发电机. (2认同)

the*_*eye 11

我们可以迭代列表,enumerate并用新值替换旧值,就像这样

myl = [1, 2, 3, 4, 5, 4, 4, 4, 6]
for idx, item in enumerate(myl):
    if item == 4:
        myl[idx] = 44
print myl
# [1, 2, 3, 44, 5, 44, 44, 44, 6]
Run Code Online (Sandbox Code Playgroud)