Как выполнить замену на месте всех вхождений элемента в список в python?

Предположим, у меня есть список:

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

Каков наиболее эффективный и простой питонический способ на месте (двойной акцент) замены всех вхождений 4 на 44?

Мне также любопытно, почему не существует standard способа сделать это (особенно, когда strings имеет не-на месте replace)?

Ответ 1

Мы можем выполнить итерацию по списку с помощью 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]

Ответ 2

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

Выполните замену не на месте с пониманием списка, затем slice-присвойте новые значения в исходный список, если вы действительно хотите изменить оригинал.

Ответ 3

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

Ответ 4

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

Подход try-except, хотя более pythonic менее эффективен. Эта программа timeit на ideone сравнивает как минимум два из представленных здесь ответов.