본문 바로가기
Language/Python

[Python] Several Dict To One Dict Using ChainMap | LIM

by forestlim 2023. 5. 18.
728x90
반응형

Intro

여러 개의 Dictionary를 관리할 때 collections 모듈의 ChainMap을 활용하면 간단하게 한 개의 Dictionary로 관리할 수 있다. ChainMap의 개념을 살펴보고 여러 개의 Dictionary를 처리하는 것을 어떻게 간소화할 할 수 있는지 알아보도록 하겠습니다.

 

ChainMap이란?

ChainMap은 Python3에서 도입된 collections 모듈의 클래스이다. ChainMap은 여러개의 Dictionary를 편리하게 하나의 Mapping으로 결합하는 방법을 제공한다. 기존의 list 안에 dict를 넣고 for 문을 돌려서 무언가를 찾거나 update 하거나 했던 일들을 쉽게 처리할 수 있도록 도와준다.

 

 

ChainMap 예시

Dict in List (List[Dict[str, int]])

[
  {'a':  1},
  {'b':  2},
  {'c':  3},
  {'d':  4},
  {'e':  5}
]

 

Using For Loop To Make Single Dict

example = [
  {'a':  1},
  {'b':  2},
  {'c':  3},
  {'d':  4},
  {'e':  5}
]

new = {}
for ex in example:
  new.update(ex)

print(new)
{'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5}

 

Using ChainMap To Make Single Dict

from collections import ChainMap

example = [
  {'a':  1},
  {'b':  2},
  {'c':  3},
  {'d':  4},
  {'e':  5}
]

new = dict(ChainMap(*example))
print(new)
{'e': 5, 'd': 4, 'c': 3, 'b': 2, 'a': 1}

 

Dict + Dict 예시

from collections import ChainMap

# 여러 개의 dict 정의
dict1 = {'a': 1, 'b': 2}
dict2 = {'c': 3, 'd': 4}

# ChainMap 생성
chain = ChainMap(dict1, dict2)
print(dict(chain))
{'c': 3, 'd': 4, 'a': 1, 'b': 2}

 

만약 위에서 두 Dict에서 동일한 키값이 있으면 어떻게 될까?

from collections import ChainMap

# 여러 개의 dict 정의
dict1 = {'a': 1, 'b': 2}
dict2 = {'b': 3, 'c': 4}

# ChainMap 생성
chain = ChainMap(dict1, dict2)

# 값 액세스
print(chain['a'])  # 출력: 1
print(chain['b'])  # 출력: 2 (dict1의 값이 dict2보다 우선)
print(chain['c'])  # 출력: 4

 

ChainMap에서 값을 수정하면 기존 Dictionary 의 값도 바뀔까? Yes!

from collections import ChainMap

# 여러 개의 dict 정의
dict1 = {'a': 1, 'b': 2}
dict2 = {'b': 3, 'c': 4}

# ChainMap 생성
chain = ChainMap(dict1, dict2)

# 값 수정
chain['a'] = 10  # 첫 번째 dict1의 값 수정
print(dict1)  # 출력: {'a': 10, 'b': 2}
print(dict2)  # 출력: {'b': 3, 'c': 4}

첫 번째 Dictionary의 값이 바뀌는 것을 볼 수 있다. 왜냐면 ChainMap의 경우 값을 복사하는 것이 아닌 참조를 하기 때문이다. 

 

ChainMap에서 키를 삭제하면 어떻게 될까?

from collections import ChainMap

# 여러 개의 dict 정의
dict1 = {'a': 1, 'b': 2}
dict2 = {'b': 3, 'c': 4}

# ChainMap 생성
chain = ChainMap(dict1, dict2)

# 키 삭제
del chain['b']
print(chain['b'])  # 출력: 3 (삭제 후 dict2의 값)
print(dict1)  # 출력: {'a': 10}

b 키를 삭제했을 때 dict1의 b 키 값인 2는 삭제되고 3이 출력되는 것을 볼 수 있다.

 

 

ChainMap의 이점

🚀 여러 개의 Dictioanry 를 관리하는 작업을 간소화한다. ChainMap을 사용하면 여러 개의 Dictionary를 단일 뷰로 결합하여 Dictionary를 병합하거나 복잡한 조회를 수행할 필요가 없어진다.

 

🚀 원래 Dictionary 를 보존한다. ChainMap에서 값을 수정하거나 키를 추가/제거하면 원래 Dictionary이 영향을 받으므로 변경 사항을 소스로 추적하기 쉽다.

 

🚀 메모리 효율적이다. ChainMap은 새로운 Dictionary를 생성하거나 원래 Dictionary를 복사하지 않는다. 원래 Dictionary에 대한 참조를 유지하여 메모리를 절약한다. 

 

 


결론적으로, Python의 collections 모듈의 ChainMap 클래스는 여러 개의 Dictionary를 관리하는데 편리하고 효율적인 방법을 제공한다. 매핑 작업을 간소화하고 다양한 Dictionary를 처리하는데 도움이 된다. 

728x90
반응형

댓글