web-dev-qa-db-ja.com

python)内のリスト内の要素のすべてのオカレンスのインプレース置換

私がリストを持っていると仮定します:

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

インプレース二重強調)すべての置換の最も効率的で最も単純なPythonの方法は何ですか444の出現?

また、これを行うためのstandard方法がない理由についても興味があります(特に、stringsnot-in-placereplace メソッド)?

10
lifebalance

このように、リストを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]
11
thefourtheye
myl[:] = [x if x != 4 else 44 for x in myl]

リスト内包表記を使用してインプレースではない置換を実行してから、元のリストを本当に変更する場合は、新しい値を元のリストにスライス割り当てします。

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

try-exceptアプローチは、より多くのPythonicですが、効率が低くなります。この ideoneのtimeitプログラム ここで提供される回答の少なくとも2つを比較します。

1
lifebalance
for  item in myl:
   if item ==4:
      myl[myl.index(item)]=44
0
apomene