for문으로 리스트에 .remove()를 썼을 때
A = [20, 21, 55, 30, 31, 60, 70, 80, 12, 13]

for a in A:
    if a < 50:
        A.remove(a)

이렇게 돌리니 결괏값으로

[21, 55, 31, 60, 70, 80, 13]
이렇게 떴습니다.

조건문에 부합하는게 연속으로 들어갈 경우 2번째 꺼가 남아버리는데 원리랑 해결책이 뭐가 있을까요?

zsa778 2299

2020년 10월 23일 5:51 오후

목록으로
2개의 답변이 있습니다. 1 / 1 Page
result = list(filter(None, map(lambda x: x if x>=50 else None, A)))

singleton

M 2020년 10월 24일 9:41 오전

감사합니다~! - zsa778님, 2020년 10월 24일 6:41 오후 추천 , 대댓글

안녕하세요.

for문으로 리스트를 반복하는 도중에 해당 리스트를 삭제하면 요소 갯수는 줄어들지만 반복하는 위치는 순서대로 증가하기 때문에 한칸씩 앞으로 당겨져서 지나치고 지나가게 되는 요소들이 발생하게 됩니다.

따라서 위와 같은 방법을 사용하면 안됩니다.

적당한 대안으로는 다음과 같은 방법이 있습니다.

A = [20, 21, 55, 30, 31, 60, 70, 80, 12, 13]
for a in A[:]:
    if a < 50:
        A.remove(a)

이처럼 A를 A[:]로 복사하여 for문을 돌리는 객체와 삭제되는 객체를 분리하거나 다음처럼 리스트 내포를 사용하시면 됩니다. 단, 이때 조건은 삭제가 아닌 포함이 되어 a<50 가 아닌 a>=50 이 되어야 겠네요.

A = [a for a in A if a >= 50]

박응용

2020년 10월 24일 9:55 오전

설명 감사합니다~! - zsa778님, 2020년 10월 24일 6:47 오후 추천 , 대댓글