14

假设我有一个列表:

myl = [1, 2, 3, 4, 5, 4, 4, 4, 6]

就地双重强调)替换所有出现的4with的最有效和最简单的pythonic方法是44什么?

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

4

4 回答 4

28
myl[:] = [x if x != 4 else 44 for x in myl]

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

于 2014-06-13T09:26:31.347 回答
16

我们可以遍历列表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]
于 2014-06-13T09:26:05.913 回答
-1
while True:
    try:
        myl[myl.index(4)] = 44
    except:
        break

try-except方法虽然更Pythonic,但效率较低。ideone 上的这个timeit 程序至少比较了这里提供的两个答案。

于 2014-06-13T10:59:41.897 回答
-2
for  item in myl:
   if item ==4:
      myl[myl.index(item)]=44
于 2014-06-13T09:26:17.397 回答