HOWTO · Python

파이썬의 조회 테이블

이 튜토리얼은 파이썬에서 조회 테이블을 사용하는 방법을 시연하며, 사전, 리스트, NumPy 배열, Pandas DataFrame과 같은 메서드를 강조합니다. 프로그래밍 기술을 최적화하고 애플리케이션 성능을 향상시키기 위해 효율적인 데이터 검색 기술을 구현하는 방법을 배우십시오. 파이썬에서 조회 테이블을 마스터하기 위한 실제 코드 예제와 자세한 설명을 탐색하십시오.

이 페이지의 내용

조회 테이블은 키나 위치로 값을 찾을 수 있도록 값을 저장하는 구조입니다. 제품 코드와 가격을 연결하는 것처럼 같은 관계를 반복해서 조회할 때 유용합니다. 결과를 미리 계산해 두면 계산을 되풀이하지 않아도 되지만, 테이블에는 메모리가 필요하며 원본 데이터가 바뀌면 테이블도 갱신해야 합니다.

키의 형태와 필요한 작업에 따라 구조를 선택하세요. 사전은 해시 가능한 임의의 키를 받을 수 있고, 리스트와 배열은 정수 위치를 사용하며, DataFrame은 이름이 붙은 열과 표 작업을 지원합니다. 아래 예제에서는 각 구조로 실제 조회를 처리하는 방법을 살펴봅니다.

데이터에 맞는 조회 테이블 구조 선택하기

먼저 값의 식별 기준이 무엇인지 생각해 보세요. 이름이나 코드처럼 촘촘한 정수 위치가 아닌 키에는 사전을 사용하세요. 위치가 0부터 시작하는 연속된 정수이고 값을 Python 시퀀스에 담을 수 있다면 리스트를 사용하세요. 데이터가 숫자이고 배열 연산이 필요하다면 NumPy 배열을 사용하세요. 각 레코드에 이름이 붙은 필드가 여러 개 있거나 필터링 같은 표 작업이 필요하다면 Pandas DataFrame을 사용하세요. NumPy와 Pandas는 외부 라이브러리이므로 예제를 실행하기 전에 프로젝트 환경에 설치해야 합니다.

키 기반 조회에는 사전 사용하기

사전은 서로 다른 해시 가능 키를 각각 값에 연결합니다. 순차적이지 않은 키에 적합하며, get을 사용하면 대체값을 명시적으로 지정할 수 있습니다. 키가 없으면 get은 지정한 기본값을 반환하고, 대괄호로 접근하면 키가 없을 때 KeyError가 발생합니다.

다음 예제를 실행해 보세요. 코드와 출력 블록의 내용은 바이트 단위 일치를 위해 영어 그대로 유지되며, 출력되는 문구도 영어입니다.

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

prices = {"tea": 2.5, "coffee": 3.0, "cocoa": 2.75}
print(prices["tea"])
print(prices.get("juice", "not listed"))
2.5
not listed

사전 조회는 평균적으로 O(1)이지만 모든 작업 부하에서 보장되는 것은 아닙니다. 키는 해시 가능해야 하고, 기존 키에 값을 할당하면 이전 값이 새 값으로 바뀝니다. 원본 레코드가 변경되면 조회 결과가 오래된 값이 되지 않도록 사전도 갱신하세요.

촘촘한 정수 인덱스에는 리스트 사용하기

유효한 인덱스가 0부터 시작하는 촘촘한 범위라면 리스트가 간단한 테이블이 됩니다. 인덱스 i는 (i + 1)번째 항목을 가리킵니다. 고객 번호처럼 드문드문 있는 식별자에는 적합하지 않습니다. 번호 사이의 간격을 사용하지 않는 슬롯으로 채우거나 별도의 매핑을 만들어야 하기 때문입니다. 리스트 인덱싱은 O(1)이며 값은 일반 Python 객체로 유지됩니다.

코드와 출력 블록의 내용은 바이트 단위 일치를 위해 영어 그대로 유지되며, 출력되는 문구도 영어입니다.

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

labels = ["bronze", "silver", "gold"]

def label_for(index):
    if 0 <= index < len(labels):
        return labels[index]
    return "index out of range"

print(label_for(2))
print(label_for(5))
gold
index out of range

명시적인 범위 검사는 0보다 작은 인덱스와 리스트 길이 이상인 인덱스를 모두 처리합니다. Python 리스트는 음수 인덱스를 사용해 끝에서부터 항목을 셀 수도 있으므로, 테이블 키가 0 이상의 위치로만 정의되어 있다면 먼저 범위를 확인하세요.

숫자 데이터에는 NumPy 배열 사용하기

테이블에 숫자 값이 있고 벡터화 계산, 슬라이싱 또는 다른 배열 연산도 필요하다면 NumPy 배열이 유용합니다. NumPy는 별도로 설치해야 하며 Python 표준 라이브러리에 포함되어 있지 않습니다. 단일 값 조회도 인덱스를 통한 검색이므로 배열이 사전보다 항상 빠른 대안인 것은 아닙니다.

코드와 출력 블록의 내용은 바이트 단위 일치를 위해 영어 그대로 유지되며, 출력되는 문구도 영어입니다.

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

import numpy as np

rates = np.array([1.0, 1.5, 2.0, 2.5])
index = 2
if 0 <= index < len(rates):
    print(rates[index])
else:
    print("index out of range")
print((rates * 2).tolist())
2.0
[2.0, 3.0, 4.0, 5.0]

외부 입력에서 인덱스를 가져오는 경우 범위 검사가 유용합니다. NumPy 배열은 일반적으로 하나의 원소 자료형을 사용하므로 수치 연산에 편리합니다. 저장할 데이터에 맞는 원소 자료형과 배열 형태를 선택하세요.

표 형식 데이터에는 Pandas DataFrame 사용하기

DataFrame은 이름이 붙은 열을 가진 레코드에 적합하며, 특히 조회가 더 큰 필터링 또는 분석 작업의 일부일 때 유용합니다. Pandas는 별도로 설치해야 합니다. 열을 기준으로 필터링하면 행을 비교하고, 행만 선택하면 DataFrame이 반환됩니다. 아래 식에서 .loc로 price 열 하나를 선택하면 Series가 반환됩니다. 필터링 과정에서 행을 모두 살펴볼 수도 있습니다. 같은 키를 반복해서 조회한다면 의미 있는 인덱스를 설정하고 .loc를 사용하는 방법을 고려하세요.

코드와 출력 블록의 내용은 바이트 단위 일치를 위해 영어 그대로 유지되며, 출력되는 문구도 영어입니다.

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

import pandas as pd

items = pd.DataFrame({
    "code": ["A", "B", "C"],
    "price": [1.25, 2.50, 3.75],
})
match = items.loc[items["code"] == "B", "price"]
if not match.empty:
    print(match.iloc[0])
else:
    print("not found")
2.5

이 패턴은 일치하는 코드가 없을 때 빈 결과를 인덱싱하지 않도록 처리합니다. 코드가 고유하고 반복해서 조회된다면 items.set_index("code").loc["B", "price"]로 레이블 조회를 표현할 수 있습니다. 접근 전에 코드가 있는지 확인하고 중복 레이블을 어떻게 처리할지 정하세요.

누락된 키와 유효하지 않은 인덱스 처리하기

호출하는 쪽에 맞는 누락값 처리 정책을 선택하세요. dict.get(key, default)는 대체값을 반환하고, key in mapping을 사용하면 키가 없는 경우와 저장된 값이 우연히 대체값과 같은 경우를 구별할 수 있습니다. 주변 로직에서 키 누락이 예외적인 상황이라면 try/except KeyError를 사용하세요. 리스트와 배열에서는 음수 위치를 끝에서부터 세지 않도록 해야 할 때 0 <= index < len(table) 조건으로 인덱스를 검증하세요. DataFrame 필터 결과에서 첫 행을 선택하기 전에 결과가 비어 있는지 확인하세요. 누락 시 호출자가 센티널, 기본값 또는 오류 중 무엇을 받는지 알 수 있도록 함수마다 처리 방식을 일관되게 유지하세요.

성능과 실용적인 장단점 비교하기

사전은 키를 기준으로 평균 O(1) 조회를 제공하고, 리스트나 1차원 배열은 위치를 기준으로 O(1) 조회를 제공합니다. DataFrame의 불리언 필터는 행을 검사하므로 일반적으로 O(n)입니다. 인덱스를 사용하면 레이블 기반으로 접근할 수 있지만, 비용과 동작은 인덱스를 구성한 방법과 데이터 형태에 따라 달라집니다. 이러한 복잡도 설명만으로 모든 입력 크기에서의 실제 실행 시간을 예측할 수는 없습니다. 초기 설정 비용, 키의 자료형, 데이터 배치, 라이브러리 연산, 메모리가 모두 영향을 줍니다.

키와 필요한 작업에 맞는 가장 단순한 구조를 사용하세요. 임의의 키에는 사전, 촘촘한 위치에는 리스트, 숫자 배열 작업에는 NumPy 배열, 레이블이 있는 표 작업에는 DataFrame이 적합합니다. 성능이 선택의 중요한 기준이라면 대표적인 데이터로 벤치마크하세요. 메모리도 고려해야 합니다. 사전은 키와 값의 매핑을 저장하고, 리스트는 Python 객체에 대한 참조를 보유하며, NumPy 배열은 자료형이 지정된 원소를 저장합니다. 실제 메모리 사용량은 데이터와 구현에 따라 달라집니다. 조회 테이블이 변경되는 원본 데이터에서 만들어졌다면 오래된 결과를 방지하도록 원본이 바뀔 때마다 테이블을 다시 만들거나 갱신하세요.