Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

Python 딕셔너리를 여러 개로 분할하고 값을 균등하게 나누는 방법

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 ...}

상황에 따라 적합한 방법이 다르므로, 원하는 결과 형태(분할된 딕셔너리 목록인지, 값이 조정된 단일 딕셔너리인지)를 먼저 정의한 후 위 방법 중 하나를 선택하면 됩니다.