リスト内包表記なしでリスト内の要素を置き換える、スライスする、または[]を使用する

Source python list replace list-comprehension

I'm taking this online Python courseと彼らは、学生が1行のソリューションを使用することを好みません。このコースでは、このソリューションの括弧は受け入れられません。

私はすでにリスト内包を使用して問題を解決しましたが、コースは私の答えを拒否しました。

問題は次のとおりです。

indexおよびその他のリストメソッドを使用して、replace(list, X, Y)内のすべてのXlistに置き換える関数Yを記述します。たとえば、L = [3, 1, 4, 1, 5, 9]の場合、replace(L, 1, 7)Lの内容を[3, 7, 4, 7, 5, 9]に変更します。この演習を困難にするために、[]を使用することは許可されていません。

注:returnを使用する必要はありません。

これは私がこれまでに持っているものですが、TypeErrorのために壊れます: 'int'オブジェクトは反復可能ではありません。
list = [3, 1, 4, 1, 5, 9]

def replace(list, X, Y):
   while X in list:
      for i,v in range(len(list)):
         if v==1:
            list.remove(1)
            list.insert(i, 7)

replace(list, 1, 7)

これは私の最初の答えでしたが、拒否されました。
list = [3, 1, 4, 1, 5, 9]

def replace(list, X, Y):
   print([Y if v == X else v for v in list])

replace(list, 1, 7)

私のより長い解決策を修正する方法についてのアイデアはありますか?
推奨答え
range()は整数のフラットリストを返すため、2つの引数に解凍することはできません。 enumerateを使用して、インデックスと値のタプルを取得します。
def replace(l, X, Y):
  for i,v in enumerate(l):
     if v == X:
        l.pop(i)
        l.insert(i, Y)

l = [3, 1, 4, 1, 5, 9]
replace(l, 1, 7)
enumerateの使用が許可されていない場合は、単純な古いカウンターを使用してください。
def replace(l, X, Y):
  i = 0
  for v in l:
     if v == X:
        l.pop(i)
        l.insert(i, Y)
     i += 1

l = [3, 1, 4, 1, 5, 9]
replace(list, 1, 7)

最後に、質問の作成者がおそらく探していたものを使用できます(これは、反復ごとにリストを線形検索するため、最も非効率的なアプローチですが)。
def replace(l, X, Y):
  for v in l:
     i = l.index(v)
     if v == X:
        l.pop(i)
        l.insert(i, Y)

l = [3, 1, 4, 1, 5, 9]
replace(l, 1, 7)
その他答え 1
これを試すこともできます(必要に応じて、[]またはenumerate()を使用しないでください)。
for i in range(len(l)):  # loop over indices
    if l.__index__(i) == X:  # i.e. l[i] == X
        l.__setitem__(i, Y)  # i.e. l[i] = Y

これはおそらく課題があなたに望んでいることではありませんが、学習目的のためにここに残しておきます。

注:listは組み込み関数ですでに使用されているため、変数名として使用しないでください。代わりに、ここではlを使用しました。
その他答え 2
enumerateが許可されていない場合は、whileループを使用することもできます。
>>> def replace(L_in, old_v, new_v):
        while old_v in L_in:
            idx=L_in.index(old_v)
            L_in.pop(idx)
            L_in.insert(idx, new_v)


>>> L = [3, 1, 4, 1, 5, 9]
>>> replace(L, 1, 7)
>>> L
[3, 7, 4, 7, 5, 9]
その他答え 3
名前としてlistを使用しないでください。多くの苦痛を引き起こします。
def replace(my_list, X, Y):
    while X in my_list:
        my_list.insert(my_list.index(X), Y)
        my_list.pop(my_list.index(X))
その他答え 4
これは私のために働いた。かなり簡単です。おそらくより少ない行でそれを行う方法ですが、これまでのWebサイトで教えられたことに基づいて、これは機能します。
def replace(L, X, Y):
   while X in L:
      i = L.index(X)
      L.insert(i, Y)
      L.remove(X)

関連記事

grepの最後の一致とそれは次の行です
foreachループからの値の割り当て
ジェネレーター関数の値をスキップする
networkxとmatplotlib間の相互作用
Pythonの「RCut」関数