HOWTO · Python

Python 목록에 인덱스가 있는지 확인

이 자습서에서는 목록 범위 및 IndexError 예외를 사용하여 Python 목록에 인덱스가 있는지 확인하는 방법을 보여줍니다.

이 페이지의 내용

Python 목록은 0부터 인덱싱하므로 첫 번째 항목의 인덱스는 0입니다. 음수가 아닌 인덱스는 접근하기 전에 0 <= index < len(items)로 확인하세요. 이미 항목을 가져오려는 중이라면 해당 접근을 IndexError 처리 구문으로 감싸세요. Python은 목록의 끝에서부터 세는 인덱스도 허용하므로 유효한 전체 범위는 -len(items)부터 len(items) - 1까지입니다.

경계 조건으로 인덱스 확인하기

목록에 접근하거나 값을 갱신하기 전에 인덱스가 유효한지 검사해야 한다면 경계 검사를 사용하세요. 0 <= index < len(items)는 첫 번째 인덱스를 포함하고 목록의 길이는 제외합니다. len(items)는 마지막 위치보다 하나 뒤에 있기 때문입니다.

다음 예제를 실행해 보세요.

이 섹션의 코드와 표시되는 레이블 또는 출력은 영어로 유지됩니다.

items = ["Apple", "Banana", "Pineapple"]
index = 1

if 0 <= index < len(items):
    print(f"{items[index]} is at index {index}.")
else:
    print(f"No item at index {index}.")
Banana is at index 1.

이 검사는 음수가 아닌 정수형 인덱스가 예상될 때 이해하기 쉽습니다. 비교는 값이 범위 안에 있는지만 확인할 뿐, 실제로 유효한 목록 인덱스인지는 확인하지 않습니다. 예를 들어 1.0은 0 <= index < len(items)를 통과하지만 items[1.0]은 TypeError를 발생시킵니다. 검사 결과가 참이라는 이유만으로 접근도 성공한다고 여기기 전에 인덱스 형식을 별도로 확인하세요. 이 검사는 Python 목록에서 사용할 수 있는 음수 인덱스도 허용하지 않습니다. 호출자가 음수 값을 전달할 수 있다면 아래 재사용 도우미에서 전체 범위를 검사하거나 애플리케이션의 요구에 따라 인덱스를 정규화하세요.

인덱스가 목록 범위를 벗어나면 조건은 False를 반환합니다. 다음 예제는 항목이 세 개인 같은 목록에서 두 경우를 모두 보여 줍니다. 코드 블록과 출력은 원문 그대로 유지되므로 예제의 표시 문구는 영어로 남습니다.

items = ["Apple", "Banana", "Pineapple"]
for index in (1, 3):
    if 0 <= index < len(items):
        print(f"{index}: {items[index]}")
    else:
        print(f"{index}: no item")
1: Banana
3: no item

IndexError를 처리해 인덱스 확인하기

항목을 가져오는 것이 목적이라면 실제 접근을 시도하고 IndexError를 처리하세요. try 블록은 좁게 유지하여 인덱싱 오류를 일으킬 수 있는 작업만 처리하게 하세요. 정수가 아닌 인덱스로 인한 TypeError 같은 다른 오류는 이 처리 구문에서 숨겨지지 않습니다. 코드 블록과 출력은 원문 그대로 유지되므로 예제의 표시 문구는 영어로 남습니다.

이 섹션의 코드와 표시되는 레이블 또는 출력은 영어로 유지됩니다.

items = ["Apple", "Banana", "Pineapple"]
index = 2

try:
    item = items[index]
except IndexError:
    print("No item at that index.")
else:
    print(f"Found {item} at index {index}.")
Found Pineapple at index 2.

이 방법은 한 번의 작업으로 접근을 확인하고 값을 가져옵니다. 인덱스를 확인한 뒤 실제로 사용하기 전에 프로그램의 다른 부분에서 목록을 변경한다면, 별도의 경계 검사는 나중의 접근이 성공한다고 보장할 수 없습니다. 그런 가능성이 중요하다면 접근 중 발생하는 오류를 처리하세요.

다음 예제는 마지막 위치를 벗어난 인덱스에 대한 처리 구문을 보여 줍니다. 코드 블록과 출력은 원문 그대로 유지되므로 예제의 표시 문구는 영어로 남습니다.

items = ["Apple", "Banana", "Pineapple"]
index = 3

try:
    item = items[index]
except IndexError:
    print(f"No item at index {index}.")
No item at index 3.

재사용 가능한 인덱스 검사 만들기

같은 검사가 여러 곳에서 필요하다면 목록 인덱스의 전체 범위를 확인하는 도우미 함수를 사용하세요. 길이가 n인 목록에서 Python이 허용하는 인덱스는 -n부터 n 미만까지입니다.

다음 예제의 코드와 출력은 원문 그대로 유지되므로 표시 문구는 영어로 남습니다.

이 섹션의 코드와 표시되는 레이블 또는 출력은 영어로 유지됩니다.

def index_exists(items, index):
    return -len(items) <= index < len(items)


fruits = ["Apple", "Banana", "Pineapple"]
for index in (2, -1, 3, -4):
    print(f"{index}: {index_exists(fruits, index)}")
2: True
-1: True
3: False
-4: False

이 도우미 함수는 정수형 인덱스를 전제로 하며, 유효한 음수 인덱스를 포함해 값이 범위 안에 있는지만 확인합니다. 1.0 같은 부동 소수점 수는 비교를 통과할 수 있지만 items[1.0]은 TypeError를 발생시킵니다. 결과가 True라는 이유만으로 접근이 성공한다고 여기기 전에 인덱스 형식을 별도로 확인하세요. 참인 결과가 나온 뒤 항목을 가져오려면 items[index]를 사용하세요. 검사와 접근 사이에 목록이 바뀔 수 있다면 검사 결과가 오래된 정보가 될 수 있으므로 접근을 try 블록으로 감싸세요.

음수 인덱스와 유효하지 않은 인덱스 처리하기

음수 인덱스는 목록의 끝에서부터 거꾸로 셉니다. -1은 마지막 항목을, -len(items)는 첫 항목을 가리킵니다. 항목이 없는 목록에는 유효한 인덱스가 없습니다. 길이가 0이므로 -0 이상이면서 0 미만인 정수는 존재하지 않습니다. 유효 범위를 벗어난 값으로 목록에 접근하면 IndexError가 발생합니다.

인덱스는 정수형이어야 합니다. 1.0 같은 부동 소수점 수는 범위 비교를 통과할 수 있지만 유효한 목록 인덱스가 아니므로 접근에 사용하면 TypeError가 발생합니다. 문자열도 유효한 목록 인덱스가 아닙니다. IndexError만 처리해서는 이러한 형식 불일치를 다룰 수 없습니다. 함수가 코드 외부에서 전달된 데이터를 받는다면 경계 검사에 의존하기 전에 형식을 별도로 확인하거나 인터페이스에서 허용하기로 한 오류를 정확히 처리하세요. 임의의 값을 정수로 변환하기 전에 잘라내기나 파싱이 호출자의 의도에 맞는지 판단하세요.

적절한 접근 방식 선택하기

음수가 아닌 인덱스에 접근하기 전에 분기하려면 경계 검사를 사용하세요. 인터페이스에서 음수 인덱스도 허용한다면 음수부터 양수까지 전체 범위를 검사하세요. 접근 자체가 목적이고 해당 위치에 항목이 없을 때 대응하려면 try/except IndexError를 사용하세요. 같은 범위 검사가 반복될 때는 재사용 도우미가 유용하지만, 항목을 가져오지는 않으며 목록이 변경된 뒤의 접근을 보호하지도 않습니다.

IndexError는 정수 인덱스가 목록에서 사용할 수 있는 위치를 벗어났음을 나타냅니다. 정수가 아닌 인덱스는 TypeError를 발생시키므로 신뢰할 수 없는 입력을 검사할 때 이 차이를 기억하세요. 이 방법들을 활용하면 위치를 미리 확인할지, 실제 접근 시점의 실패를 처리할지 선택할 수 있습니다.