2016-10-26 8 views
1

リストから重複を削除する関数を手動で作成しようとしています。私は似たようなことをするPython関数があることを知っていますが(set())、自分で作成したいのです。これは私が持っているものです。リスト内の重複を削除する関数を作成する

def remove(lst): 

for i in range(len(lst)): 
    aux = lst[0:i] + lst[i+1:len(lst)] 
    if lst[i] in aux: 
     del(lst[i]) 

return lst 

私は用が現在オンになっている以外のすべての項目にサブリストを作成するような何かをしようとし、その項目がリストに残っているかどうかを確認しました。そうであれば、取り外します。

問題は、それが私に範囲外のエラーのインデックスを与えることです。 for i in range(len(lst)):行は、開始するたびに更新されませんか?リストからアイテムを削除するので、リストは短くなります。したがって、10個のアイテムと2個の複製があるリストの場合、7番目に停止する代わりにインデックス9になります。

これを修正する方法はありますか、これをやり直すのは別の方法ですか?

+0

を。 – JETM

+0

*私はこれをやってみるのは別の方法ですか?* <---はい、その – wim

+0

?私はそれをやろうとしましたが、del(lst [d])dが重複するすべてのインデックスを持つリストであるとすぐに、dの他のすべての値がオフになっているため、 – Myntekt

答えて

1

問題は、反復処理中にリストを操作していることです。つまり、リストの最後に到達すると、削除された要素であるため、リストの末尾が短くなります。リストをループしている間は、(一般的に)要素を削除しないようにする必要があります。

+0

はい、それはまさに問題ですが、私は言及した別のユーザーとして、しばらくお待ちしています!ありがとう – Myntekt

1

これはあなたの現在のスクリプトを修正するものではありませんが、この作品のようなものでしょうか?

def remove(lst): 
    unique=[] 
    for i in lst: 
     if i not in unique: unique.append(i) 
    return unique 

単にループして別のリストを作成し、メンバーシップをチェックするだけですか?

0

初めての場合:len(lst)は、ループを入力したときにのみ評価されます。あなたはそれを再評価したい場合は、しばらくバージョンを試してみてください。

i = 0 
while i < len(lst): 
    ... 
    i += 1 

次に、あなたは別の問題を心配してもらう:あなたは私だけ項目を削除しないとき増分します。削除すると、リストを短くすると次の要素に移動します。

i = 0 
while i < len(lst): 
    aux = lst[0:i] + lst[i+1:len(lst)] 
    if lst[i] in aux: 
     del(lst[i]) 
    else: 
     i += 1 

私はあなたの問題を解決する必要があります...あなたが意図したロジックを使用していると思います。

0
def remove(lst): 
    new_list = [] 
    for i in lst: 
     if i not in new_list: 
      new_list.append(i) 
    return new_list 

セカンダリリストに値を追加する必要があります。 Bobbyrogers saidのように、変化しているリストを反復処理することはお勧めできません。

0

また、この試すことができます:あなたはループの後にすべてを処理、その後、削除する必要があります項目のすべてのインデックスを格納することができ

lst = [1,2,3,3,4,4,5,6] 
lst2 = [] 
for i in lst: 
    if i not in lst2: 
     lst2.append(i) 
print(lst2) 
[1, 2, 3, 4, 5, 6] 
関連する問題