파이썬에서 리스트의 단일 요소를 삭제하는 것은 del 함수와 인덱스만 있으면 간단합니다. 하지만 여러 개의 인덱스에 해당하는 요소들을 한 번에 삭제해야 하는 상황도 자주 발생합니다. 이 글에서는 인덱스 목록에 지정된 위치의 요소들만 골라서 리스트에서 제거하는 두 가지 방법을 살펴봅니다.
방법 1: sorted()와 del 조합하기
첫 번째 방법은 삭제할 인덱스 값들을 담은 별도의 리스트를 만드는 것입니다. 핵심은 인덱스를 내림차순으로 정렬하는 것입니다. 앞쪽 인덱스부터 삭제하면 뒤쪽 요소들이 앞으로 당겨져 위치가 밀리기 때문에, 의도하지 않은 요소가 삭제될 수 있습니다. 따라서 큰 인덱스부터 차례로 삭제해야 나머지 요소들의 위치가 그대로 유지됩니다.
예제
Alist = [11, 6, 8, 3, 2]
# 삭제할 인덱스 목록
idx_list = [1, 3, 0]
# 원본 리스트 출력
print("Given list is : ", Alist)
# 인덱스 목록 출력
print("The indices list is : ", idx_list)
# sorted()와 del 사용
for i in sorted(idx_list, reverse=True):
del Alist[i]
# 결과 출력
print("List after deleted elements : ", Alist)
실행 결과
Given list is : [11, 6, 8, 3, 2] The indices list is : [1, 3, 0] List after deleted elements : [8, 2]
idx_list는 내림차순 정렬 후 [3, 1, 0]이 되어, 인덱스 3 → 1 → 0 순서로 요소가 삭제됩니다. 덕분에 나머지 요소들의 인덱스가 변하지 않아 [8, 2]라는 올바른 결과를 얻을 수 있습니다.
방법 2: enumerate와 not in 활용하기
같은 작업을 enumerate와 not in 조건을 조합한 리스트 컴프리헨션(list comprehension)으로도 처리할 수 있습니다. 인덱스 목록에 포함되지 않은 요소들만 골라 새로 구성한 뒤, 슬라이싱 할당(Alist[:])을 통해 원본 리스트를 그대로 갱신하는 방식입니다. 실행 결과는 첫 번째 방법과 완전히 동일합니다.
예제
Alist = [11, 6, 8, 3, 2]
# 삭제할 인덱스 목록
idx_list = [1, 3, 0]
# 원본 리스트 출력
print("Given list is : ", Alist)
# 인덱스 목록 출력
print("The indices list is : ", idx_list)
# enumerate와 not in 사용
Alist[:] = [j for i, j in enumerate(Alist)
if i not in idx_list]
# 결과 출력
print("List after deleted elements : ", Alist)
실행 결과
Given list is : [11, 6, 8, 3, 2] The indices list is : [1, 3, 0] List after deleted elements : [8, 2]
두 방법 비교 및 마무리
sorted()와 del을 조합한 방법은 절차가 직관적이고 추가 메모리 사용이 적습니다. 반면 enumerate와 not in을 활용한 리스트 컴프리헨션 방식은 파이썬다운 선언형 문법으로 가독성이 뛰어납니다. 두 방식 모두 동일한 결과를 반환하므로, 코드 스타일과 상황에 맞게 선택해서 사용하면 됩니다.