1. 단일 원소 정수 검색 (Indexing)

시퀀스(Sequence) 자료형이나 매핑(Mapping) 자료형의 인스턴스가 지닌 수많은 데이터 중에서, 특정 위치의 값 하나만을 가리켜 모셔오는 행위를 단일 검색(Indexing)이라고 부릅니다.

조회할 때 뿐만 아니라 검색된 위치에 새로운 값을 대입(=)하여 내부データを 갱신하거나, 삭제(del)할 때도 동일한 검색 기법이 사용됩니다.

1.1 시퀀스 자료형의 정방향과 역방향 (Index)

리스트나 문자열처럼 일렬로 나열된 데이터들은 데이터의 주소값 역할을 하는 ‘정수 인덱스(Index)’를 가집니다.

  • 정방향 (0부터 시작): 앞에서부터 검색할 때는 무조건 0부터 출발합니다. (원소가 n개라면 0부터 n-1까지 접근 가능)
  • 역방향 (-1부터 시작): 맨 뒤에서부터 찾고 싶을 때는 특수하게 음수를 사용하여 -1부터 시작할 수 있습니다. 문자열 길이를 몰라도 맨 뒤 문자를 즉시 알아낼 수 있는 파이썬만의 강력한 기능입니다.
message = "역방향 검색"

# 1. 정방향: 0부터 5까지 (띄어쓰기도 1칸을 차지)
print(message[0]) # "역"
print(message[2]) # "향"

# 2. 역방향: 맨 뒤 문자는 길이가 얼마든 무조건 -1
print(message[-1]) # "색"
print(message[-2]) # "검"

[!CAUTION] 만약 데이터 범위를 벗어난 번호(예를 들어, 개수가 10개인데 [15]를 호출)를 할당하면, 즉시 프로그램이 멈추며 IndexError 예외가 발생합니다.


1.2 딕셔너리의 키(Key) 검색 특징

딕셔너리는 ‘순서(정수 인덱스)’라는 개념이 없으므로, 값을 꺼내올 때 오로지 고유한 해시 키(Key)만을 사용해 추적합니다.

user_score = {'math': 90, 'english': 85}

print(user_score['math']) # 90
# print(user_score['science']) -> 존재하지 않는 키를 호출하면 KeyError 폭발!

치명적인 검색 예외 대처법 (operator getter, get)

대괄호 [] 방식은 찾고자 하는 것이 없으면 자비 없이 즉시 에러를 발생시킵니다. 시스템 다운을 방지하기 위해서는 안전장치 기능이 내장된 메서드를 사용해야 합니다.

  1. dict.get(표적, 기본값): 위에서 배운 메서드로, 값이 없어도 에러 대신 안전하게 None 이나 지정된 기본값을 반환합니다.
  2. operator.itemgetter(표적들): operator 표준 라이브러리가 제공하는 이 함수는 여러 개의 키나 여러 위치의 인덱스를 한 번에 뽑아낼 때 매우 유용합니다. 하지만 값이 없으면 여전히 에러를 발생시킵니다.
from operator import itemgetter

scores = {'a': 100, 'b': 80, 'c': 50}

# a키와 c키의 값을 한꺼번에 빼오는 전용 함수(getter) 생성
combo_getter = itemgetter('a', 'c')

# 결과는 (100, 50) 형태의 튜플로 반환됨
print(combo_getter(scores)) 

1.3 검색 위치의 데이터 갱신 및 삭제

변경 가능한 객체(리스트, 딕셔너리)의 경우, 위치를 나타내는 대괄호 연산자 구조 그대로 데이터의 교체 수정이나 완전 삭제(del 키워드) 명령을 결합할 수 있습니다.

# ==================== (1) 갱신 (Update) ====================
my_list = [10, 20, 30]
my_list[1] = 999 
print(my_list) # [10, 999, 30] (1번 인덱스가 교체됨)

my_dict = {'a': 1}
my_dict['a'] = 100
my_dict['b'] = 200 # 딕셔너리는 없는 키를 할당하면 새로운 항목이 "추가"됩니다.
print(my_dict) # {'a': 100, 'b': 200}


# ==================== (2) 삭제 (Delete) ====================
del my_list[0] 
print(my_list) # [999, 30] (0번 인덱스가 터지면서 뒤 요소들이 앞으로 당겨짐)

del my_dict['a']
print(my_dict) # {'b': 200}
서브목차