2016-07-24 19 views
0

リストから重複を削除しようとしています。私は下のコードでそれをしようとしています。Python 3:IndexError:リストインデックスが範囲外です。

>>> X 
['a', 'b', 'c', 'd', 'e', 'f', 'a', 'b'] 
>>> for i in range(X_length) : 
... j=i+1 
... if X[i] == X[j] : 
... X.pop([j]) 

しかし、私は助けてください

Traceback (most recent call last): 
    File "<stdin>", line 2, in <module> 
IndexError: list index out of range 

を取得しています。

+0

コードの一部が欠落していますか? 'j'とは何ですか?いずれにせよ、私はあなたが行くにつれてあなたが最後に短くなっているということを前提としています。 'i'が最大値に達する頃には、リストはもはや長くないので、あなたはインデックスエラーがあります。 – smarx

+0

X_lengthとjは何ですか? – kaitian521

+0

'X_length'とは何ですか? 'j'は何ですか? '' X.pop([j]) 'とは何ですか? –

答えて

2

リストからアイテムを削除すると、アイテムのサイズが変更されます。だから、インデックス番目iはもはや特定の削除後に存在しないことがあります。

>>> x = ['a', 'b', 'c', 'd', 'e'] 
>>> x[4] 
'e' 
>>> x.pop() 
'e' 
>>> x[4] 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
IndexError: list index out of range 

重複する項目を削除する簡単な方法は、ユニークなアイテムだけを含めることができますset、にあなたのリストを変換することです。リストとして持っている必要がある場合は、それをリストに戻すことができます:list(set(X))。ただし、ここでは注文は保存されません。あなたは連続で重複を削除したい場合は、ない重複している項目を格納する新しい配列を使用することを検討して


:そう、我々は超えてしまうので、私達の範囲は、バインド

unique_x = [] 
for i in range(len(x) - 1): 
    if x[i] != x[i+1]: 
     unique_x.append(x[i]) 
unique_x.append(x[-1]) 

len(x) - 1ですx[i+1]を使用する場合は配列の境界になります。

+0

入力リストにはどのようなものがありますか?['a'、 'b'、 'c'、 'd'、 'e'、 'f'、 'a'、 'b'、 'a'、 'a'] ' ?出力は '['a'、 'b'、 'c'、 'd'、 'e'、 'f'、 'a'、 'b'、 'a']' – SilentMonk

+0

@ SilentMonkはい、最後の値を新しいリストに追加している限りです。 –

0

シーケンスが常に変化するので、シーケンスを反復しながら変更することは、一般的にはお勧めしません。ここではいくつかの他の方法は次のとおりです。与えられた

list(set(X)) 
['a', 'c', 'b', 'e', 'd', 'f'] 

X = ['a', 'b', 'c', 'd', 'e', 'f', 'a', 'b'] 

あなたが(と順序は問題ではない)リストから重複を除去する際にのみ関心がある場合は、セットを使用することができます


あなたは秩序を維持し、リスト内のどこにでもを重複を削除したい場合は、あなたがそれをすることができますERATEながら新しいリスト:あなたが連続で重複を削除したい場合

X_new = [] 
for i in X: 
    if i not in X_new: 
     X_new.append(i) 

X_new 
# Out: ['a', 'b', 'c', 'd', 'e', 'f'] 

、smarxの答え@考えます。

0

リストの最後の反復で、jの値はi + 1に設定され、この場合は長さになります。8です。 X[j]にアクセスしようとしますが、jはリストの最後を超えています。

代わりに、単にセットにリストを変換:あなたはordered setのため他の場所で探す必要があります。その場合には順序を、保持する必要がある場合を除き

>>> set(X) 
{'e', 'f', 'd', 'c', 'a', 'b'} 

2

@ Rushyの回答は素晴らしいと思います。あなたは連続で重複を削除したいとあなたが(リストを変更するのではなく秒1を作成することによって)その場でそれをを行いたい場合は、言っ

、一つの共通の技術は、リストを逆方向にあなたのように動作することです:

def remove_consecutive_duplicates(lst): 
    for i in range(len(lst) - 1, 1, -1): 
     if lst[i] == lst[i-1]: 
      lst.pop(i) 

x = ['a', 'b', 'b', 'c', 'd', 'd', 'd', 'e', 'f', 'f'] 
remove_consecutive_duplicates(x) 
print(x) # ['a', 'b', 'c', 'd', 'e', 'f'] 

リストの最後から始めて、逆に移動することで、あなたはそれを短くしたので、リストの末尾をオフに実行しているの問題を回避します。

など。あなたは 'AABC' で開始し、前方に移動した場合、あなたはインデックス0、1、2使いますし、逆方向に行く3.

0 
| 
aabc 

(Found a duplicate, so remove that element.) 

1 
| 
abc 

    2 
    | 
abc 

    3 
    | 
abc <-- Error! You ran off the end of the list. 

は、あなたは、インデックス3、2、1を使用しますと、0 :

3 
    | 
aabc 

    2 
    | 
aabc 

1 
| 
aabc 

(Found a duplicate so remove that element.) 

0 
| 
abc <-- No problem here! 
関連する問題