Pythonで辞書を複数のキーに分割し、値を均等に配分する方法を徹底解説
Pythonでデータを扱っていると、「辞書(dict)の各キーの値を、複数の新しいキーに均等に分割したい」という場面に出くわすことがあります。例えば、在庫数量を複数の倉庫に振り分けたり、予算を複数の項目に割り当てたりするケースが典型です。
この記事では、辞書の値を複数のキーへ均等分割する基本的な方法から、割り切れない場合の余りの処理方法まで、実用的なコード例とともにわかりやすく解説します。
基本形:値を決まった数のキーに均等分割する
最もシンプルなのは、各キーに対してループ処理を行い、値を指定した個数で割って新しいキーを生成する方法です。
data = {'apple': 100, 'banana': 60}
n = 4 # 分割するキーの数
result = {}
for key, value in data.items():
for i in range(n):
result[f'{key}_{i+1}'] = value / n
print(result)
# {'apple_1': 25.0, 'apple_2': 25.0, 'apple_3': 25.0, 'apple_4': 25.0,
# 'banana_1': 15.0, 'banana_2': 15.0, 'banana_3': 15.0, 'banana_4': 15.0}
/ 演算子を使うと結果は必ず float 型になるため、整数のまま扱いたい場合は次に紹介する「余り処理」が必要になります。
割り切れない場合:余りを先頭のキーに配分する
整数値を扱う場合、//(切り捨て除算)と %(剰余)を組み合わせることで、合計値が変わらないようにきれいに分割できます。一般的なアプローチは、余りを先頭側のキーに1ずつ加算していく方法です。
def split_dict(d, n):
"""辞書の各値をn個のキーに均等分割し、余りは先頭のキーに配分する"""
result = {}
for key, value in d.items():
base = value // n
remainder = value % n
for i in range(n):
result[f'{key}_{i+1}'] = base + (1 if i < remainder else 0)
return result
print(split_dict({'apple': 103, 'banana': 61}, 4))
# {'apple_1': 26, 'apple_2': 26, 'apple_3': 26, 'apple_4': 25,
# 'banana_1': 16, 'banana_2': 16, 'banana_3': 15, 'banana_4': 14}
この方法なら sum() で集計しても元の値と一致するため、金額や在庫数など正確性が求められるデータに適しています。
応用:固定サイズごとにチャンク分割する
「キーの数」ではなく「1つあたりの上限サイズ」で分割したい場合は、以下のようにチャンク方式が便利です。
import math
def split_by_chunk(d, chunk_size):
"""各値をchunk_sizeごとのチャンクに分割する"""
result = {}
for key, value in d.items():
num_chunks = math.ceil(value / chunk_size)
remaining = value
for i in range(num_chunks):
take = min(chunk_size, remaining)
result[f'{key}_{i+1}'] = take
remaining -= take
return result
print(split_by_chunk({'item_a': 250}, 100))
# {'item_a_1': 100, 'item_a_2': 100, 'item_a_3': 50}
まとめ
- 値を指定した個数に分割するなら、
//と%を組み合わせた均等分割が有効 - 整数データでは余りの配分方法を意識すると、合計の整合性が保てる
- 上限サイズごとに分けたい場合は、チャンク分割の関数を作ると柔軟に対応できる
このテーマについては、Stack Overflowでも活発な議論が行われており、ユースケースごとに最適な実装が異なります。自分の用途(整数か小数か、キー数指定かサイズ指定か)に合わせて、上記のコードをカスタマイズして活用してください。
-
Pythonで辞書(dict)のすべてのキーを取得・表示する方法
Pythonでは、辞書(dict)オブジェクトが持つ keys() メソッドを使うことで、すべてのキーを簡単に取得できます。このメソッドは辞書内の全キーを含むビューオブジェクト(dict_keys)を返します。 keys() メソッドでキーを取得する まずは基本的な使い方を見てみましょう。次の例では、3つのキーと値を持つ辞書から、すべてのキーを取り出しています。 >>> D1 = {1:a, 2:b, 3:c} >>> D1.keys() dict_keys([1, 2, 3]) >>> list(D1.keys()) [1, 2, 3]
-
【Python入門】セミコロン区切りの文字列を辞書(dict)に変換する簡単な方法
セミコロン区切りの文字列を辞書に変換したい Pythonでは、次のような「キー=値」のペアがセミコロン(;)で連結された文字列を扱うことがあります。 Name1=Value1;Name2=Value2;Name3=Value3 このような文字列を辞書(dict)型に変換するのは非常に簡単です。基本的な考え方は以下の2ステップです。 文字列を split(;) でセミコロンごとに分割する 各要素をさらに split(=) でイコール記号ごとに分割し、その結果を dict() コンストラクタに渡す 具体的なコード例 実際のコードはわずか1行で書けます。リスト内包表記ではなくジェネレータ式を使う