python for문
조회수 706회
a = ['123']
b = ['345', '456', '675', '678']
for i in b:
if i not in a:
b.remove(i)
print(b)
원하는 b
의 결과 값은 []
인데 왜 첫번째 요소만 삭제되는 것일까요?
-
(•́ ✖ •̀)
알 수 없는 사용자 - 〉
1 답변
-
순회되고 있는 list와
remove()
되고 있는 list가 같기 때문입니다.a = ['123'] b = ['345', '456', '675', '678'] for i in b: print("지금 i -->", i) if i not in a: print("아직 b -->", b) b.remove(i) print("이제 b -->", b)
위 코드를 실행해 보면 이런 게 찍힙니다.
지금 i --> 345 아직 b --> ['345', '456', '675', '678'] 이제 b --> ['456', '675', '678'] 지금 i --> 675 아직 b --> ['456', '675', '678'] 이제 b --> ['456', '678']
두번째 "지금 i"를 보시면
'456'
이 나와야 할 거 같은데'675'
를 꺼내오고 있습니다. 왜냐하면 지금 파이썬이 생각하기에b
에 대하여 이번에 순회해야 하는 인덱스는1
이기 때문이지요.['456', '675', '678']
의 1번 인덱스에 해당하는 원소는'675'
가 되고, 그래서 여기서는'675'
를 선택하고 지우게 됩니다.
일단 원하시는 것을 얻기 위한 가장 짧고 빠른 방법은 원본의 카피를 뜬 리스트에 대해서 순회를 도는 거라고 합니다.
for i in list(b): # <-- 이렇게만 바꿔도 원하시는 것을 얻을수 있음
좀더 의미론적으로 문제에 접근하자면, 이 작업은 본질적으로 특정 리스트에서 특정 원소들만 걸러내는 것이므로 이런 접근들이 가능합니다.
a = ['123'] b = ['345', '456', '675', '678'] c = list(filter(lambda x: x in a, b)) d = [x for x in b if x in a] print(c) # [] print(d) # []
댓글 입력