파이썬 for문에서 리스트 항목을 지웠는데 일부가 남는 이유

이 카테고리 글 목록

전체글 보기

리스트에서 조건을 만족하는 항목만 남기려면, 남길 항목으로 새 리스트를 만드세요. 예를 들어 15cm 이상인 줄기만 고를 때는 입력을 한 번 읽어 새 목록을 만들 수 있습니다.

heights = [8, 10, 15, 24]
kept = [height for height in heights if height >= 15]
print(kept)
print(heights)
[15, 24]
[8, 10, 15, 24]

for문 안에서 삭제하면 다음 항목을 건너뛸 수 있습니다

같은 가상 길이 목록에서 순회 중에 remove()를 호출해 보면 짧은 줄기 하나가 결과에 남습니다.

heights = [8, 10, 15, 24]
for height in heights:
    if height < 15:
        heights.remove(height)
print(heights)
[10, 15, 24]

먼저 0번 자리의 8을 지우면 10이 0번 자리로 당겨집니다. 리스트 이터레이터는 다음 번호인 1번 자리로 진행하므로 그때의 15를 읽습니다. 10은 조건을 검사할 차례를 놓칩니다.

같은 리스트 객체에 결과를 반영해야 할 때

다른 이름도 같은 리스트를 참조하고 있고 그쪽에서도 바뀐 결과를 봐야 한다면, 먼저 남길 항목을 만든 뒤 heights[:]에 대입합니다.

heights = [8, 10, 15, 24]
same_list = heights
heights[:] = [height for height in heights if height >= 15]
print(same_list)
print(same_list is heights)
[15, 24]
True

heights = [...]처럼 이름에 새 목록을 대입하면 same_list는 이전 목록을 계속 가리킵니다. 전체 슬라이스 대입은 기존 리스트의 내용에 결과를 반영합니다.

길이 값은 가상 입력이며 Windows의 Python 3.14.3에서 실행했습니다. Python의 시퀀스 순회와 슬라이스 대입 규칙을 참고하세요.

이 카테고리의 다른 글

전체글 보기

댓글 남기기