在Python中就地替换列表中所有元素的出现次数

22 投票
4 回答
44116 浏览
提问于 2025-04-18 09:39

假设我有一个列表:

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

那么,有什么最简单又高效的方式可以在这个列表里直接把所有的 4 替换成 44 呢?这里的“直接”是指不需要创建一个新的列表,而是在原来的列表上进行修改。

我也很好奇,为什么没有一个“标准”的方法来做到这一点呢?特别是当 字符串 有一个不在原地的 replace 方法时?

4 个回答

-2
for  item in myl:
   if item ==4:
      myl[myl.index(item)]=44

当然可以!请把你想要翻译的内容发给我,我会帮你用简单易懂的语言解释清楚。

-2
while True:
    try:
        myl[myl.index(4)] = 44
    except:
        break

虽然使用 try-except 的方法更符合 Python 的风格,但效率却比较低。这个 在 ideone 上的 timeit 程序 对这里提供的至少两个答案进行了比较。

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

用列表推导式来进行替换,这样就不会直接在原来的列表上修改。然后,如果你真的想改变原来的列表,可以把新的值切片赋值回去。

22

我们可以用 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]

撰写回答