programing

반복하는 동안 목록 수정

nicescript 2021. 1. 18. 07:38
반응형

반복하는 동안 목록 수정


이 질문에 이미 답변이 있습니다.

l  = range(100)                         
for i in l:                         
    print i,                         
    print l.pop(0),                  
    print l.pop(0)

위의 파이썬 코드는 예상과는 상당히 다른 출력을 제공합니다. 반복하는 동안 항목을 건너 뛸 수 있도록 항목을 반복하고 싶습니다.

설명 해주십시오.


나는 목록을 반복하는 동안 목록을 수정하려고하는 (다른 사람의) "영리한"코드에 물린 적이 있습니다. 어떤 상황에서도 절대하지 않겠다고 결심했습니다.

slice 연산자 mylist[::3]사용 하여 목록의 모든 세 번째 항목으로 건너 뛸 수 있습니다 .

mylist = [i for i in range(100)]
for i in mylist[::3]:
  print(i),

내 예제에 대한 다른 점은 파이썬 3.0의 새로운 구문과 관련이 있습니다.

  • Python 3.0에서 작동하기 때문에 mylist를 정의하기 위해 목록 이해력을 사용합니다 (아래 참조).
  • print는 파이썬 3.0의 함수입니다.

Python 3.0 range ()는 이제 임의의 크기 값으로 작동한다는 점을 제외하고는 작동하던 xrange ()처럼 작동합니다. 후자는 더 이상 존재하지 않습니다.


반복되는 컨테이너를 절대 변경하지 마십시오. 해당 컨테이너의 반복자는 변경 사항에 대한 정보를받지 못하므로 매우 다른 루프 및 / 또는 잘못된 루프를 생성 할 가능성이 높습니다. 일반적인 경우에는 컨테이너 복사본을 반복하는 것이 도움이되지만 , 루프의 50 개 구간 후에 컨테이너가 비어 있고 다시 터뜨리면 다음과 같은 결과를 얻을 수 있으므로 원하지 않는 것이 분명합니다. 예외.

분명한 것은 무엇입니까? 달성하려는 행동이 있다면 무엇입니까?! 아마 당신은 당신의 욕망을 while...?

i = 0
while i < len(some_list):
    print i,                         
    print some_list.pop(0),                  
    print some_list.pop(0)

일반적인 경험 법칙은 컬렉션 / 배열 / 목록을 반복하는 동안 수정하지 않는 것입니다.

보조 목록을 사용하여 작업 할 항목을 저장하고 초기 루프 이후 루프에서 해당 논리를 실행합니다.


이 시도. 일반적으로 코드 냄새 인 반복되는 항목을 변경하는 것을 방지합니다.

for i in xrange(0, 100, 3):
    print i

을 참조하십시오 xrange.


배열의 진실성을 확인하는 while 루프를 사용하십시오.

while array:
    value = array.pop(0)
    # do some calculation here

그리고 오류나 우스운 행동없이해야합니다.


나는 이것이 당신이 원하는 것이라고 생각합니다.

l  = range(100)  
index = 0                       
for i in l:                         
    print i,              
    try:
        print l.pop(index+1),                  
        print l.pop(index+1)
    except:
        pass
    index += 1

팝되는 항목의 수가 런타임 결정일 때 코딩하는 것이 매우 편리합니다. 그러나 그것은 매우 나쁜 효율성으로 실행되며 코드를 유지하기가 어렵습니다.


이 슬라이스 구문은 목록의 복사본을 만들고 원하는 작업을 수행합니다.

l  = range(100)  
for i in l[:]:  
    print i,  
    print l.pop(0),  
    print l.pop(0)

참조 URL : https://stackoverflow.com/questions/1637807/modifying-list-while-iterating

반응형