web-dev-qa-db-ja.com

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

私はこれをオンラインで取っていますPythonコース そして彼らは学生が1行のソリューションを使用するのを嫌います。コースはこのソリューションの括弧を受け入れません。

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

問題は次のとおりです。

indexおよびその他のリストメソッドを使用して、X内のlistのすべての出現箇所をYに置き換える関数replace(list, X, 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)
_

私のより長い解決策を修正する方法についてのアイデアはありますか?

6
StacyM

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)
8
Asad Saeeduddin

これを試すこともできます(必要に応じて、_[]_ sまたは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を使用しました。

3
arshajii

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]
2
CT Zhu

名前として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))
1
dansalmo

asad Saeeduddinに完全に同意しますが、iの最初の値は-1でなければなりません。これは、必要なリストの最初のオブジェクトを置き換えるのに役立ちます。

def replace(l, X, Y):
    i = -1
    for v in l:
        i += 1
        if v == X:
            l.pop(i)  # remove item at given position (position number i)
            l.insert(i, Y)  # insert item Y at position i

l = [1, 1, 4, 1, 5, 9]
replace(l, 1, 7)
print(l)
0
ToanHD

これは私のために働いた。かなり簡単です。おそらくより少ない行でそれを行う方法ですが、これまでのWebサイトで教えられたことに基づいて、これは機能します。

def replace(L, X, Y):
   while X in L:
      i = L.index(X)
      L.insert(i, Y)
      L.remove(X)
0
aclark