파이썬에서 딕셔너리는 기본적으로 키-값 쌍으로 이루어진 자료구조입니다. 딕셔너리를 확장하여 다차원 자료구조로 사용할 수 있으며, 이를 통해 보다 복잡한 계층적 데이터를 관리할 수 있습니다. 딕셔너리를 상속하거나 중첩하여 다차원 데이터를 관리하는 방식은 매우 유용합니다. 아래에서는 파이썬 딕셔너리의 상속다차원 구조에 대한 설명과 예제를 제시합니다.

1. 파이썬 딕셔너리 상속

파이썬에서 클래스 상속을 통해 딕셔너리의 기능을 확장할 수 있습니다. 기본적으로 파이썬 딕셔너리 클래스인 dict를 상속받아 커스텀 딕셔너리를 구현할 수 있습니다.

예제: 딕셔너리 상속

# 딕셔너리를 상속한 CustomDict 클래스 정의
class CustomDict(dict):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

    # 특정 키가 없을 때 기본값을 반환하는 메서드 추가
    def get_with_default(self, key, default=None):
        return self.get(key, default)

    # 딕셔너리 내용 출력하기
    def print_dict(self):
        for key, value in self.items():
            print(f"{key}: {value}")

# CustomDict 사용 예제
my_dict = CustomDict({"a": 1, "b": 2})

# 기본적인 딕셔너리 기능 사용
print(my_dict["a"])  # 출력: 1

# 추가한 메서드 사용
print(my_dict.get_with_default("c", 0))  # 출력: 0 (키 "c"가 없으면 0 반환)

# 딕셔너리 내용 출력
my_dict.print_dict()  # 출력: a: 1, b: 2

위 코드에서 CustomDict 클래스는 기본 dict 클래스를 상속받아 새로운 메서드를 추가하거나 기능을 확장했습니다. 이처럼 딕셔너리를 상속하면 커스텀 기능을 추가할 수 있습니다.

2. 다차원 자료구조로 딕셔너리 사용

딕셔너리를 중첩하여 다차원 자료구조로 사용할 수 있습니다. 딕셔너리 내에 또 다른 딕셔너리를 값으로 저장하면, 이를 통해 트리나 복잡한 계층적 구조를 쉽게 관리할 수 있습니다.

예제: 중첩 딕셔너리

# 중첩된 딕셔너리 (다차원 자료구조)
multi_dim_dict = {
    "사용자1": {
        "이름": "홍길동",
        "나이": 30,
        "취미": ["독서", "등산"]
    },
    "사용자2": {
        "이름": "이순신",
        "나이": 40,
        "취미": ["낚시", "영화 감상"]
    },
}

# 중첩된 딕셔너리 값에 접근
print(multi_dim_dict["사용자1"]["이름"])  # 출력: 홍길동
print(multi_dim_dict["사용자2"]["취미"])  # 출력: ['낚시', '영화 감상']

# 새로운 데이터 추가
multi_dim_dict["사용자3"] = {
    "이름": "강감찬",
    "나이": 50,
    "취미": ["게임", "여행"]
}

print(multi_dim_dict["사용자3"])  # 출력: {'이름': '강감찬', '나이': 50, '취미': ['게임', '여행']}

이 예제에서는 딕셔너리를 중첩하여 사용자 정보를 저장하고, 다차원 데이터처럼 관리합니다. 각 사용자는 딕셔너리로 표현되고, 딕셔너리 안에 다시 이름, 나이, 취미 등이 딕셔너리나 리스트로 표현되어 있습니다.

3. 재귀적으로 생성되는 다차원 딕셔너리

딕셔너리를 사용할 때, 재귀적으로 구조를 확장하여 자동으로 다차원 딕셔너리를 생성할 수 있습니다. 이를 위해 파이썬의 collections.defaultdict를 사용할 수 있습니다.

예제: defaultdict를 이용한 재귀적 딕셔너리

from collections import defaultdict

# 재귀적으로 다차원 딕셔너리를 만드는 함수
def recursive_defaultdict():
    return defaultdict(recursive_defaultdict)

# 다차원 딕셔너리 생성
multi_level_dict = recursive_defaultdict()

# 데이터 추가
multi_level_dict["level1"]["level2"]["level3"] = "다차원 데이터"

# 값 확인
print(multi_level_dict["level1"]["level2"]["level3"])  # 출력: 다차원 데이터

위 코드에서는 defaultdict를 사용해 딕셔너리의 값을 자동으로 재귀적으로 생성하여, 여러 단계의 계층을 가진 다차원 자료구조를 손쉽게 구현합니다.

4. 딕셔너리 기반의 다차원 데이터 접근 및 수정

다차원 딕셔너리를 사용할 때, 데이터의 접근 및 수정을 효율적으로 처리할 수 있는 도구를 만들어 사용할 수 있습니다.

예제: 중첩된 딕셔너리에서 값 추가 및 업데이트

# 중첩 딕셔너리에서 값을 추가하거나 업데이트하는 함수
def update_nested_dict(d, keys, value):
    for key in keys[:-1]:
        d = d.setdefault(key, {})
    d[keys[-1]] = value

# 다차원 딕셔너리
nested_dict = {
    "a": {
        "b": {
            "c": 1
        }
    }
}

# 값을 추가하거나 업데이트
update_nested_dict(nested_dict, ["a", "b", "d"], 2)
update_nested_dict(nested_dict, ["a", "e"], 3)

# 결과 출력
print(nested_dict)
# 출력: {'a': {'b': {'c': 1, 'd': 2}, 'e': 3}}

이 함수는 다차원 딕셔너리에서 여러 단계의 키를 통해 값을 추가하거나 수정할 수 있도록 해줍니다. 이를 통해 딕셔너리의 계층 구조에서 원하는 위치에 데이터를 추가할 수 있습니다.

결론

  • 딕셔너리 상속을 통해 파이썬의 기본 dict 클래스에 새로운 기능을 추가하거나 커스터마이징 할 수 있습니다.
  • 중첩 딕셔너리는 다차원 데이터를 표현하는 유용한 방법이며, 딕셔너리를 중첩하여 복잡한 계층적 구조를 쉽게 관리할 수 있습니다.
  • defaultdict를 사용하면 재귀적으로 다차원 딕셔너리를 생성하여 보다 유연한 데이터 구조를 구현할 수 있습니다.
  • 딕셔너리의 다차원 구조에서 값을 접근하고 수정하는 함수를 작성하면 데이터 관리가 더욱 쉬워집니다.

+ Recent posts