콘텐츠로 건너뛰기

Python 튜토리얼: 디폴트 딕트(기본 사전) 사용법

[

Python defaultdict을 사용하여 누락된 키 처리하기

일반적인 상황에서 Python 딕셔너리를 사용할 때 딕셔너리에 존재하지 않는 키에 접근하거나 수정하려고 할 때 KeyError가 발생할 수 있습니다. 이러한 상황을 처리하기 위해 collections 모듈에서 제공하는 Python defaultdict 타입을 사용할 수 있습니다. defaultdict은 일반적인 Python 딕셔너리와 거의 동일한 방식으로 동작하지만, 누락된 키에 접근하거나 수정하려고 할 때 자동으로 키를 생성하고 기본값을 생성합니다. 이를 통해 defaultdict은 딕셔너리 내 누락된 키를 처리하는 데 유용한 옵션입니다.

Python defaultdict 이해하기

Python defaultdict 타입은 기본 값이 있는 딕셔너리로 동작하는 클래스입니다. defaultdict을 사용하면 키에 접근하거나 수정할 때 키가 존재하지 않으면 자동으로 키를 생성하고 기본값을 할당합니다. 이를 통해 딕셔너리에 없는 키에 접근하더라도 KeyError가 발생하지 않고 기본값이 반환됩니다.

Python defaultdict 사용하기

Python defaultdict을 사용하여 누락된 키를 처리하는 방법은 다음과 같습니다:

항목 그룹화하기

from collections import defaultdict
employees = [
{"name": "John", "department": "HR"},
{"name": "Jane", "department": "IT"},
{"name": "Dave", "department": "HR"},
{"name": "Mark", "department": "IT"},
{"name": "Lisa", "department": "HR"}
]
department_employees = defaultdict(list)
for employee in employees:
department_employees[employee["department"]].append(employee["name"])
print(department_employees)

위의 예제에서는 defaultdict을 사용하여 부서별로 직원을 그룹화했습니다. defaultdict을 사용하면 department_employees 딕셔너리에서 누락된 키에 접근하더라도 KeyError가 발생하지 않고 자동으로 누락된 키에 대한 빈 리스트를 생성하여 값을 추가합니다.

고유한 항목 그룹화하기

from collections import defaultdict
employees = ["John", "Jane", "Dave", "Mark", "Lisa",
"John", "Dave", "Mark", "Lisa", "John"]
unique_employees = defaultdict(int)
for employee in employees:
unique_employees[employee] += 1
print(unique_employees)

위의 예제에서는 defaultdict을 사용하여 직원들의 이름을 그룹화하고 각 이름이 등장한 횟수를 계산했습니다. defaultdict을 사용하면 unique_employees 딕셔너리에서 누락된 키에 접근하더라도 KeyError가 발생하지 않고 자동으로 누락된 키에 대한 기본값인 0을 반환하고 값을 증가시킵니다.

항목 개수 세기

from collections import defaultdict
numbers = [1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3]
number_count = defaultdict(int)
for number in numbers:
number_count[number] += 1
print(number_count)

위의 예제에서는 defaultdict을 사용하여 숫자 리스트에서 각 숫자가 등장한 횟수를 계산했습니다. defaultdict을 사용하면 number_count 딕셔너리에서 누락된 키에 접근하더라도 KeyError가 발생하지 않고 자동으로 누락된 키에 대한 기본값인 0을 반환하고 값을 증가시킵니다.

값 누적하기

from collections import defaultdict
sales = [
{"product": "Apple", "amount": 100},
{"product": "Orange", "amount": 200},
{"product": "Apple", "amount": 150},
{"product": "Orange", "amount": 250},
{"product": "Apple", "amount": 200}
]
total_sales = defaultdict(int)
for sale in sales:
total_sales[sale["product"]] += sale["amount"]
print(total_sales)

위의 예제에서는 defaultdict을 사용하여 제품별 판매량을 누적했습니다. defaultdict을 사용하면 total_sales 딕셔너리에서 누락된 키에 접근하더라도 KeyError가 발생하지 않고 자동으로 누락된 키에 대한 기본값인 0을 반환하고 값을 누적시킵니다.

defaultdict와 dict 비교하기

defaultdict과 일반적인 dict의 차이점에 대해 알아보겠습니다.

defaultdict vs dict

defaultdict은 일반적인 dict와 거의 동일하지만, defaultdict은 누락된 키에 접근하더라도 KeyError가 발생하지 않고 자동으로 누락된 키에 대한 기본값을 생성하여 값을 할당합니다. 일반적인 dict는 누락된 키에 접근하면 KeyError가 발생합니다.

defaultdict.default_factory

defaultdict은 딕셔너리를 생성할 때 기본값을 생성하는 함수인 default_factory를 인자로 받을 수 있습니다. 기본값을 생성하는 함수는 딕셔너리를 생성하는 동안 한 번만 호출되며, 기본값으로 사용할 경우 int, list, dict 등과 같은 타입을 사용할 수 있습니다.

defaultdict vs dict.setdefault()

dict의 setdefault() 메서드를 사용하여 누락된 키에 대한 기본값을 설정할 수 있습니다. setdefault() 메서드는 키가 존재하는지 확인하고, 존재하지 않는 경우 기본값으로 키를 생성하고 값을 할당합니다. 하지만 이 방법은 반복문에서 많은 키에 접근해야 하거나 다중 차원의 dict에서 사용할 때 불편할 수 있습니다. defaultdict을 사용하면 이러한 경우에 편리하게 누락된 키를 처리할 수 있습니다.

defaultdict.missing()

defaultdict은 missing() 메서드를 오버라이드하여 누락된 키에 대한 동작 방식을 변경할 수 있습니다. missing() 메서드를 정의하여 누락된 키를 처리하는 방법을 사용자 정의할 수 있습니다.

Python defaultdict 타입 에뮬레이션하기

defaultdict은 우리가 기본적인 값을 얻을 수 없는 멤버에 대해 기본 값을 설정해주는 매우 유용한 클래스입니다. 그러나 때로는 defaultdict을 사용할 수 없는 상황이 발생할 수 있습니다. 이러한 경우에는 defaultdict을 에뮬레이션하여 같은 효과를 얻을 수 있습니다.

.default_factory에 인수 전달하기

default_factory에 값을 전달하려면 다음과 같은 방법을 사용할 수 있습니다:

lambda 사용

from collections import defaultdict
default_int = defaultdict(lambda: 0)
print(default_int[1]) # 0
print(default_int[2]) # 0

위의 예제에서는 lambda 함수를 사용하여 기본값으로 0을 설정하는 defaultdict을 생성했습니다. 이는 누락된 키에 접근하면 자동으로 기본값인 0을 반환합니다.

functools.partial() 사용

from collections import defaultdict
from functools import partial
default_str = defaultdict(partial(str, "-"))
print(default_str[1]) # "1-"
print(default_str[2]) # "2-"

위의 예제에서는 functools.partial() 함수를 사용하여 ”-“(마이너스)로 끝나는 기본값을 설정하는 defaultdict을 생성했습니다. 이는 누락된 키에 접근하면 자동으로 기본값인 ”-“(마이너스)가 뒤에 추가되어 반환됩니다.

결론

이 튜토리얼에서는 Python defaultdict 타입을 사용하여 누락된 키를 처리하는 방법에 대해 알아보았습니다. defaultdict은 딕셔너리와 거의 유사하지만 누락된 키에 접근하거나 수정하려고 할 때 자동으로 키를 생성하고 기본값을 할당합니다. 이를 통해 defaultdict은 딕셔너리 내 누락된 키를 처리하는 강력한 옵션입니다. 다양한 용도에 따라 defaultdict을 사용하여 그룹화, 계수, 값 누적 등의 작업을 효과적으로 수행할 수 있습니다.

이 튜토리얼을 통해 Python defaultdict 타입을 익힌 후에는 일상적인 프로그래밍 과제에서 더 효과적으로 활용할 수 있을 것입니다.

이 튜토리얼에서는 defaultdict을 효율적으로 사용할 수 있도록 상세한 설명과 실행 가능한 예제 코드를 포함했습니다. 따라서 해당 내용을 실제로 실행해보고 결과를 확인하면서 defaultdict의 사용 방법을 익히시기 바랍니다.