Python에서 하나의 딕셔너리(dictionary)를 여러 개의 딕셔너리로 분할하거나, 각 키의 값을 일정한 비율로 나누어야 하는 경우가 종종 있습니다. 이 글에서는 대표적인 두 가지 상황과 그 해결 방법을 소개합니다.
1. 딕셔너리를 N개의 딕셔너리로 분할하기
키-값 쌍을 순서대로 나누어 여러 개의 딕셔너리로 분배하는 가장 간단한 방법은 슬라이싱(slicing)과 리스트 컴프리헨션을 활용하는 것입니다.
d = {'a': 1, 'b': 2, 'c': 3, 'd': 4}
n = 2 # 나눌 개수
items = list(d.items())
result = [dict(items[i::n]) for i in range(n)]
print(result)
# [{'a': 1, 'c': 3}, {'b': 2, 'd': 4}]
items[i::n] 슬라이싱을 사용하면 인덱스를 n 간격으로 건너뛰며 요소를 배분하기 때문에, 항목 수가 n으로 나누어 떨어지지 않아도 마지막 딕셔너리에 남은 항목이 자연스럽게 모이게 됩니다.
2. 각 값을 동일하게 나누기
딕셔너리 구조는 유지한 채, 모든 값(value)을 특정 수로 나누고 싶다면 딕셔너리 컴프리헨션(dict comprehension)이 가장 깔끔합니다.
d = {'a': 10, 'b': 20, 'c': 30}
divisor = 2
result = {k: v / divisor for k, v in d.items()}
print(result)
# {'a': 5.0, 'b': 10.0, 'c': 15.0}
정수 연산이 필요하다면 v // divisor(몫) 또는 round(v / divisor)를 사용하면 됩니다.
3. itertools를 활용한 균등 분할
itertools.islice를 사용하면 반복자(iterator) 기반으로도 딕셔너리를 분할할 수 있어, 큰 데이터를 다룰 때 메모리 효율이 좋습니다.
from itertools import islice
it = iter(d.items())
size = len(d) // n + (len(d) % n > 0)
result = [dict(islice(it, size)) for _ in range(n)]
정리
- 키-값 쌍을 여러 딕셔너리로 분배: 슬라이싱
[i::n]또는itertools.islice활용 - 값 자체를 균등하게 나누기: 딕셔너리 컴프리헨션으로
{k: v/n for ...}
상황에 따라 적합한 방법이 다르므로, 원하는 결과 형태(분할된 딕셔너리 목록인지, 값이 조정된 단일 딕셔너리인지)를 먼저 정의한 후 위 방법 중 하나를 선택하면 됩니다.