파이썬에서 while 루프를 사용하여 작업을 수행하고 있습니다. 그러나 루프는 내가 예상 할 때 (팀이 비어있을 때) 끝나지 않습니다. 다음은 코드입니다.
while teams:
if scores[0]<scores[1]:
losers.append(teams[0])
teams.remove(teams[0])
teams.remove(teams[0])
scores.remove(scores[0])
scores.remove(scores[0])
if scores[0]>scores[1]:
losers.append(teams[1])
teams.remove(teams[0])
teams.remove(teams[0])
scores.remove(scores[0])
scores.remove(scores[0])
return losers
코드를 테스트하는 동안 print 문을 입력하고 losers 배열에 예상 된 결과가 있음을 발견했습니다. 그러나 마지막 반복에서 scores [0]을 이미 삭제 한 경우 scores [0]을 확인하면서 중단 될 것으로 예상 한 후에도 루프가 계속됩니다. 루프의. 내 루프가 끝나지 않는 이유는 무엇입니까?
수정 사항은 두 번째 if
문을 elif
다음과 같이 변경하는 것입니다 .
while teams:
if scores[0]<scores[1]:
losers.append(teams[0])
teams.remove(teams[0])
teams.remove(teams[0])
scores.remove(scores[0])
scores.remove(scores[0])
elif scores[0]>scores[1]:
losers.append(teams[1])
teams.remove(teams[0])
teams.remove(teams[0])
scores.remove(scores[0])
scores.remove(scores[0])
return losers
문제는 teams
및 scores
목록이 마지막 쌍에 도달하고 첫 번째 if
명령문 의 조건 이 True
인 경우 최종 쌍이 제거되고 두 목록이 모두 비어 있다는 것입니다.
그런 다음 두 번째 if
조건이 평가되지만 scores
목록은 이제 비어 if
있으므로 ( 이전 일치에 따라) an IndexError
이 발생합니다.
로 변경 elif
하면 첫 번째 조건이 인 경우에만 두 번째 조건이 평가됩니다 False
. 이제 루프는 반복 당 한 쌍의 팀 / 점수 만 처리하고 빈 테스트 team
는 성공합니다.
다음과 같이 while 루프를 좀 더 명확하게 만들 수 있습니다.
while teams:
if scores[0] < scores[1]:
losers.append(teams[0])
elif scores[0] > scores[1]:
losers.append(teams[1])
else:
# this should never happen
print('Error: drawn match detected!')
losers.append(None) # or simply ignore if that makes sense
teams[:] = teams[2:] # remove the first 2 items
scores[:] = scores[2:]
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다