2017-12-28 6 views
-1

함수가 목록 및 정수 n을 가져오고 인덱스 i이 을 만족하면 모든 요소가 삭제됩니다. 그러나인덱스가 조건을 만족하는 모든 요소를 ​​삭제합니다. 목록 할당 인덱스가 범위를 벗어났습니다.

def f(lst, n): 
    for i in range(len(lst)): 
     if (i+1)%n==0: 
      del lst[i] 

, 그것은 나에게 오류를 제공합니다 : 내가 가지고 올 한 내용을 여기

Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "pop.py", line 4, in f 
    del lst[i] 
IndexError: list assignment index out of range 

범위를 벗어 실행할 수있을 것 같지 않습니다 i 인덱스 포인터? 이것이 일어나는 원인은 무엇입니까?

+0

명확성과 테스트를 위해 예제 데이터를 제공해주십시오. –

+1

[반복하는 동안 목록에서 항목 제거] (https://stackoverflow.com/questions/1207406/remove-items-from-a-list-while-iterating) – abccd

+0

항목을 제거하면 어떻게되는지 생각해보십시오 목록에서. 이 목록의 길이가 변경됩니다. –

답변

2

어떤 데이터 세트를 사용하십니까? 데이터 세트의 숫자에 따라 문제는 목록에서 특정 인덱스를 요청할 때 충돌을 일으키는 목록에서 개체를 삭제한다는 것입니다.

ex_list = [2, 5, 12] 
print range(len(ex_list)) 

output [0, 1, 2] 

그럼 첫 번째 항목이 테스트를 통과하지 못하고 삭제 된 경우를 가정 해 보겠습니다. 이제 oyur 목록은 다음과 같습니다 궁극적으로

ex_list[1] 
>>>12 

과 :

ex_list[2] 
>>>IndexError: list assignment index out of range 
1

은 무엇입니까

ex_list 
>>>[5, 12] 

문제는 당신의 난 다음 루프 지금 일 수 있지만 것입니다 목록에서 요소를 삭제할 때 목록 크기가 변경됩니다.

n으로 나눌 수있는 색인을 찾으려면 목록을 반복 할 필요가 없습니다.
예 : list_length = 8이고 n = 2이면 요소 # [2,4,6,8] = 색인 [1,3,5,7]을 삭제해야한다는 것을 알 수 있습니다. 당신은 여기 필터를 만들거나이 같은 지능형리스트도

new_list = [old_list[i] for i in range(len(old_list_length)) if (i+1) % n == 0] 
old_list = new_list 

을, 뭐하고합니다 : - 당신은, a 요소가 삭제 된 목록을 반복주의 ​​할 수있는 원래의 요소 때문에 당신이에 좋아 삭제, 이제 다른 색인을 갖습니다. 답의 시작에서 예를 들면 - 을 사용하면 element#2(index = 1)을 삭제했다고 말할 수 있습니다. 이제 후속 element#4,#8element #3, #7이되어 이제 목록을 삭제하려는 원래 요소를 추적 할 수 없습니다.

관련 문제