HOWTO · Python
Fix ValueError: list.remove(x): X Not in List 오류 in Python
이 튜토리얼은 Python에서 ValueError: list.remove(x): x not in list를 수정하는 방법을 알려줍니다.
이 페이지의 내용
ValueError: list.remove(x): x not in list는 remove()가 전달한 값과 같은 값을 찾지 못했다는 뜻입니다. 확인한 뒤 목록이 바뀌었거나, 값이 예상과 다르거나, 처음부터 목록에 없었을 수 있습니다. list.remove(x)는 값을 기준으로 항목을 제거합니다. 정해진 위치의 항목을 제거하려면 del items[index] 또는 items.pop(index)를 사용하세요.
list.remove(x)에서 ValueError가 발생하는 이유
remove()는 호출 한 번에 값 하나를 받아 처음 일치하는 항목을 제거합니다. 목록에 같은 값이 여러 개 있으면 나머지 일치 항목은 그대로 남습니다. 따라서 같은 값으로 다시 호출했을 때 성공하려면, 목록에 같은 값이 하나 더 있어야 합니다.
다음은 간단한 성공 예제입니다. 그대로 실행할 수 있도록 목록도 같은 코드 조각에서 정의합니다.
이 섹션의 코드와 표시되는 레이블 또는 출력은 영어로 유지됩니다.
items = ["science", "maths", "computer", "english"]
items.remove("computer")
print(items)
첫 번째 호출 뒤에는 "computer"가 더 이상 items에 없습니다. 같은 값에 remove()를 다시 호출하면 ValueError가 발생하며, 메시지는 list.remove(x): x not in list입니다. 다음 실행 예제는 오류를 잡아 스크립트가 종료되지 않도록 하면서 오류의 종류와 메시지를 출력합니다.
items = ["science", "maths", "computer", "english"]
items.remove("computer")
try:
items.remove("computer")
except ValueError as error:
print(f"{type(error).__name__}: {error}")
이 메서드는 현재 목록에서 동등성 비교로 값을 찾습니다. 문자열은 대소문자와 공백이 중요하므로 "Computer"와 "computer"는 서로 다른 값입니다. 사용자 정의 객체의 동등성 비교는 해당 객체의 __eq__ 구현을 따릅니다. 항목이 있는 것처럼 보이는데 제거에 실패한다면 호출 직전에 목록을 확인하고, 실제 값과 형식을 전달한 값과 비교하세요. 앞선 제거 작업이나 필터링, 다른 입력 때문에 확인한 시점과 호출 시점 사이에 목록이 바뀌었을 수 있습니다.
항목을 제거하기 전에 있는지 확인하기
값이 목록에 없을 수도 있다면 remove()를 호출하기 전에 포함 여부를 확인하세요. in 연산자도 동등성으로 비교하므로 이 검사는 제거와 같은 기준으로 일치 항목을 찾습니다. 이 패턴을 적용할 때는 목록과 요청할 값을 함께 정의하세요.
이 섹션의 코드와 표시되는 레이블 또는 출력은 영어로 유지됩니다.
items = ["science", "maths", "english"]
item = "computer"
if item in items:
items.remove(item)
print(items)
값이 있으면 조건을 통과한 호출이 처음 일치하는 항목을 제거합니다. 값이 없으면 조건문 본문을 건너뛰므로 목록은 바뀌지 않습니다. 값이 없는 상황이 예상되고 별도 조치가 필요하지 않을 때 유용합니다. 반대로 값이 없다는 것이 프로그래밍 오류를 뜻한다면, 조용히 건너뛰는 동작이 원인을 감출 수 있습니다. 데이터를 검증하거나 목록을 만드는 지점에서 오류를 처리하세요.
포함 여부 확인과 제거는 별개의 작업입니다. 중간에 목록이 바뀌지 않는 일반적인 단일 스레드 코드에서는 두 작업이 같은 목록 상태를 기준으로 합니다. 프로그램의 다른 부분이 확인과 호출 사이에 목록을 수정할 수 있다면 확인만으로 제거 성공을 보장할 수 없습니다. 접근을 조정하거나 해당 작업에서 발생할 수 있는 ValueError를 처리하세요.
목록에서 여러 항목을 안전하게 제거하기
목록에 있는 것이 확실한 값을 여러 개 제거하려면 값마다 remove()를 한 번씩 호출하세요. 한 번의 호출에 여러 값의 목록을 전달할 수는 없습니다. 다음 독립 실행 예제는 두 값을 차례로 제거합니다.
이 섹션의 코드와 표시되는 레이블 또는 출력은 영어로 유지됩니다.
items = ["science", "maths", "computer", "english"]
items.remove("maths")
items.remove("english")
print(items)
요청할 값이 여러 개라면 반복문으로 순회하세요. 요청한 값 중 하나라도 없을 수 있다면 호출마다 포함 여부를 확인합니다.
items = ["science", "maths", "computer", "english"]
requested = ["maths", "history", "english"]
for item in requested:
if item in items:
items.remove(item)
print(items)
포함 여부를 확인하지 않으면 없는 값이 처음 요청되는 시점에 반복문이 ValueError와 함께 중단되어 이후 값을 처리하지 못할 수 있습니다. 확인을 추가하면 없는 값은 건너뛰고 나머지 요청을 계속 처리합니다. 두 방식 모두 원래 목록을 수정하며 요청 하나당 일치 항목 하나만 제거합니다. 조건에 맞는 항목을 모두 제거하려는 경우에는 컴프리헨션이나 필터를 사용해 새 목록을 만드세요. remove()를 반복 호출할 때는 제거 횟수와 일치 기준을 명확히 정해야 합니다.
데이터에 맞는 방법을 선택하세요. 값이 있다고 확신하면 바로 호출하고, 값이 없는 상황이 정상이라면 포함 여부를 확인한 뒤 제거하며, 값이 없는 상황을 알려야 한다면 명시적으로 오류를 처리하세요. 예상치 못한 오류가 발생하면 현재 목록의 내용을 확인하세요.