복붙노트

[PYTHON] 파이썬 : 목록 색인 범위를 벗어난 오류

PYTHON

파이썬 : 목록 색인 범위를 벗어난 오류

나는 간단한 파이썬 프로그램을 작성했다.

l=[1,2,3,0,0,1]
for i in range(0,len(l)):
       if l[i]==0:
           l.pop(i)

이 오류는 l '[i] == 0 인 경우 줄의'범위를 벗어난 목록 색인 '오류가 발생합니다.

디버깅 후 나는 점점 커지고 목록이 줄어들고 있음을 알 수있었습니다. 그러나 루프 종료 조건은

해결법

  1. ==============================

    1.범위를 반복하면서 목록의 길이를 줄이면 range 문에서 색인의 끝에 도달 할 때 일부 색인은 더 이상 유효하지 않습니다.

    범위를 반복하면서 목록의 길이를 줄이면 range 문에서 색인의 끝에 도달 할 때 일부 색인은 더 이상 유효하지 않습니다.

    당신이하고 싶은 것은 다음과 같습니다.

    l = [x for x in l if x != 0]
    

    0 인 요소가 없어도 l의 복사본을 반환합니다 (이 작업을 목록 작성이라고 함). 0이 아닌 숫자가 True로 평가되므로 마지막 부분을 x로 줄여도됩니다.

    len (l)은 반복 전에 재 계산되지 않기 때문에 len (l)의 루프 종료 조건과 같은 것은 없습니다. 코드를 작성한 방식에 따라 len (l)이 각 반복에서 다시 계산되지 않기 때문에 사전에 계산됩니다. 그런 식으로 작성할 수 있습니다.

    i = 0
    while i < len(l):
       if l[i] == 0:
           l.pop(i)
       else:
           i += 1
    
  2. ==============================

    2.식 len (l)은 range () 내장 함수가 평가되는 순간에만 한 번 평가됩니다. 이 때 작성된 범위 객체는 변경되지 않습니다. 그것은 아마도 대상에 대해 아무것도 알 수 없습니다.

    식 len (l)은 range () 내장 함수가 평가되는 순간에만 한 번 평가됩니다. 이 때 작성된 범위 객체는 변경되지 않습니다. 그것은 아마도 대상에 대해 아무것도 알 수 없습니다.

    추신 나는 가치에 대한 형편없는 이름이다! 숫자 1 또는 대문자 I처럼 보입니다.

  3. ==============================

    3.목록을 반복하는 동안 목록의 크기가 변경되는데 이는 원하는 내용이 아니며 오류의 원인입니다.

    목록을 반복하는 동안 목록의 크기가 변경되는데 이는 원하는 내용이 아니며 오류의 원인입니다.

    편집 : 다른 사람들이 대답하고 댓글을 달았을 때, 목록 내포가 첫 번째 선택으로 더 낫습니다. 특히이 질문에 대한 응답으로 좋습니다. 나는 그 이유에 대한 대안으로 이것을 제시했고, 최선의 대답은 아니지만 여전히 문제를 해결합니다.

    그래서 그 메모에, 당신은 당신이 원하지 않는 목록의 항목을 평가하는 함수를 호출 할 수있는 filter를 사용할 수도 있습니다.

    예:

    >>> l = [1,2,3,0,0,1]
    >>> filter(lambda x: x > 0, l)
    [1, 2, 3]
    

    라이브로 배우십시오. 복잡한 일이 필요할 때를 제외하고는 단순합니다.

  4. ==============================

    4.Mark Rushakoff가 말한 것은 사실이지만, 반대 방향으로 반복하면 for 루프의 목록에서 요소를 제거 할 수도 있습니다. 예 :

    Mark Rushakoff가 말한 것은 사실이지만, 반대 방향으로 반복하면 for 루프의 목록에서 요소를 제거 할 수도 있습니다. 예 :

    x = [1,2,3,0,0,1]
    for i in range(len(x)-1, -1, -1):
        if x[i] == 0:
            x.pop(i)
    

    마치 위로부터 바닥까지 떨어지는 높이의 건물과 같습니다. 비록 그것이 붕괴의 한가운데에도 여전히 "들어가서"아직 붕괴 된 바닥을 방문 할 수 있습니다.

  5. ==============================

    5.문제는 목록 len ()을 사용하는 루프 내에서 참조했던 목록을 수정하려고 시도했기 때문입니다. 목록에서 항목을 제거하면 다음 루프에서 새 len ()이 계산됩니다.

    문제는 목록 len ()을 사용하는 루프 내에서 참조했던 목록을 수정하려고 시도했기 때문입니다. 목록에서 항목을 제거하면 다음 루프에서 새 len ()이 계산됩니다.

    예를 들어 처음 실행 한 후 l.pop (i)를 사용하여 (i) 제거했을 때 성공적으로 실행되었지만 다음 루프에서는 목록의 길이가 변경되어 모든 인덱스 번호가 이동되었습니다. 특정 지점에서 루프는 오류를 던진 단락 목록을 통해 실행하려고 시도합니다.

    루프 밖에서이 작업을 수행하는 경우 루프를 만들기 전에 비어있는 목록을 먼저 선언하고 새 목록을 작성하는 것이 좋습니다. 나중에 루프 내에서 유지하려는 모든 항목을 새 목록에 추가하십시오.

    똑같은 문제를 일으킨 당신들에게.

  6. ==============================

    6.목록 이해력은 당신을 해결책으로 이끌 것입니다.

    목록 이해력은 당신을 해결책으로 이끌 것입니다.

    하지만 파이썬에서 객체를 복사하는 올바른 방법은 Python 모듈 복사를 사용하는 것입니다.

    l=[1,2,3,0,0,1]
    for i in range(0,len(l)):
       if l[i]==0:
           l.pop(i)
    

    대신에,

    import copy
    l=[1,2,3,0,0,1]
    duplicate_l = copy.copy(l)
    for i in range(0,len(l)):
       if l[i]==0:
           m.remove(i)
    l = m
    

    그런 다음 자신의 코드가 작동했을 것입니다. 그러나 최적화를 위해 목록 이해는 좋은 해결책입니다.

  7. ==============================

    7.파이썬 3.3.5를 사용하고 있습니다. while 루프를 사용하는 위의 솔루션은 저에게 효과적이지 않았습니다. len (l) 뒤에 print (i)를 써도 오류가 발생합니다. 커맨드 라인 (셸)에서 동일한 코드를 실행했습니다. [함수를 실행할 때 팝업 창] 오류없이 실행됩니다. 내가 한 것은 주 프로그램에서 함수 밖에서 len (l)을 계산하고 길이를 매개 변수로 전달한 것입니다. 그것은 효과가 있었다. 때때로 파이썬이 이상합니다.

    파이썬 3.3.5를 사용하고 있습니다. while 루프를 사용하는 위의 솔루션은 저에게 효과적이지 않았습니다. len (l) 뒤에 print (i)를 써도 오류가 발생합니다. 커맨드 라인 (셸)에서 동일한 코드를 실행했습니다. [함수를 실행할 때 팝업 창] 오류없이 실행됩니다. 내가 한 것은 주 프로그램에서 함수 밖에서 len (l)을 계산하고 길이를 매개 변수로 전달한 것입니다. 그것은 효과가 있었다. 때때로 파이썬이 이상합니다.

  8. from https://stackoverflow.com/questions/1798796/python-list-index-out-of-range-error by cc-by-sa and MIT license