2014-09-18 4 views
1

이 코드는 중복되지 않는IndexError : 난 그냥 이해하지 못하는 범위를 벗어난리스트 인덱스 중복

[2, 1, 'apple', ['true', 'burps', 'taste', 'good'], 3, 'jennifer'] 

저에게 목록을 제공

X = ['jennifer', 1, 1, 2, 'apple', 3, 3, 1, 'apple', ['true', 'burps','taste', 'good'], ['true', 'burps', 'taste', 'good'], 3, 'jennifer'] 

for index in reversed(range(len(X))): 
    if X.count(X[index]) > 1: 
     X.remove(X[index]) 

작동을 제거하는 이유는이 단지 작품에 갈 때 역. 다음과 같은 점이 왜 똑같지 않습니까?

for i in range(0,len(X)): 
    if X.count(X[i]) > 1: 
     X.remove(X[i]) 

나는 오류를 얻을

if X.count(X[i]) > 1: 
IndexError: list index out of range 
내가 읽고있다 목록에서 요소를 제거하고

어느 쪽이든, 왜 첫 번째 예는 범위를 초과하지하지만, 두 번째는 것 것인가? 두 번째 예제가 제대로 작동하도록하려면 어떻게해야합니까?

답변

1

아니요, 두 번째 예는 작동하지 않습니다. 역전 된 버전이 작동하는 이유는 최악의 경우 목록의 "마지막"요소에만 액세스하고 있기 때문입니다.

X에 5 개의 요소가 있고 모두 중복 된 경우 왼쪽으로 하나가 될 때까지 모든 요소를 ​​제거한다고 가정합니다. 처음에는 len(X)이 5이므로 for 루프가 4 3 2 1 0에 대해 반복됩니다. 1 개의 요소를 제거 할 때마다 목록은 1 씩 줄어 듭니다. 따라서 최대 색인은 4에서 시작하여 3, 2, 1, 0으로 축소됩니다. 따라서 목록에 액세스하는 순서와 정확하게 일치하므로 IndexError가 없습니다.

인덱스의 값의 테이블, 각 단계에서 X에서 액세스 할 수있는 최대 인덱스 :

index Max. index of X 
4  4 
3  3 
2  2 
1  1 
0  0 

당신이 (. 1 단계에서 예를 들어 모든 중복) 1 개 이상 요소를 제거하려고하면 각 라운드 IndexError가 다시 나타날 수 있습니다.

1

그것은 같이 그것을 통해 반복하면서 목록을 변경하는 것은 좋은 생각이 아니다 :

for i in range(0,len(X)): 
if X.count(X[i]) > 1: 
    X.remove(X[i]) 

하나의 옵션이 다시 사람이 아닌 복사를 반복 한 후 제거하려는 사람과 목록을 작성입니다 명부.

또 다른 옵션은 중복을 허용하지 않는 set object을 사용하는 것입니다.

+0

아마도 사실 일지 모르지만 목록이 변경 될 수 있다는 아이디어로 작업하고 있으며이 방법으로 수행 할 수 있다고 확신합니다. – JMJ

+0

그런 다음 가장 좋은 옵션은 다른 Anwser가 말한 것처럼 뒤로 반복하는 것입니다. 하지만 여전히 중복을 허용하지 않는 객체를 사용할 수 있습니다. – lucasmullerm

1

반복하는 동안 목록을 수정하면 앞으로 수행 할 작업을 삭제할 때마다 len이 줄어들고 반복이 끝날 때 색인이 범위를 벗어납니다. 거꾸로 돌아 가면 문제가 발생하지 않습니다.

관련 문제