반복하는 동안 목록 수정
이 질문에 이미 답변이 있습니다.
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
'programing' 카테고리의 다른 글
"element.dispatchEvent는 함수가 아닙니다."FF3.0의 방화범에서 js 오류가 발생했습니다. (0) | 2021.01.18 |
---|---|
유창한 API 만들기 (0) | 2021.01.18 |
WPF TreeView HierarchicalDataTemplate-여러 자식 컬렉션이있는 개체에 바인딩 (0) | 2021.01.18 |
Gnuplot 선 유형 (0) | 2021.01.17 |
순서가 지정된 목록의 숫자를 굵게 표시하는 방법이 있습니까? (0) | 2021.01.17 |