假设我有一个列表:
myl = [1, 2, 3, 4, 5, 4, 4, 4, 6]
就地(双重强调)替换所有出现的4
with的最有效和最简单的pythonic方法是44
什么?
我也很好奇为什么没有standard
办法做到这一点(特别是当strings
有一个非就地 replace
方法时)?
myl[:] = [x if x != 4 else 44 for x in myl]
使用列表推导执行非就地替换,然后如果您真的想更改原始列表,则将新值切片分配到原始列表中。
我们可以遍历列表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]
while True:
try:
myl[myl.index(4)] = 44
except:
break
该try-except
方法虽然更Pythonic,但效率较低。ideone 上的这个timeit 程序至少比较了这里提供的两个答案。
for item in myl:
if item ==4:
myl[myl.index(item)]=44