Pythonには辞書(dict)というキー・バリュー型の便利で強力な変数が備わっています。他の言語では「連想配列」と呼ばれるものです。
今回は辞書を分割する方法を解説しています。
リストをN分割したり、スライスを作るのはよくあることですが、辞書を分割することはあまりないはずです。
そんなかなりニッチなテーマですが、忘れたときのためにメモを残しておきます。
辞書dictを任意の大きさに分割する
itertools.islice()
メソッドを使います。
itertools モジュールは標準ライブラリなのでインストールは不要(import は必要)
今回テストデータとして以下のような data
を用意しています。含まれているキーは合計10個(0〜9)。
data = { i:i**2 for i in range(10) }
#{
# 0: 0,
# 1: 1,
# 2: 4,
# 3: 9,
# 4: 16,
# 5: 25,
# 6: 36,
# 7: 49,
# 8: 64,
# 9: 81
#}
結論からいえば、辞書を分割するには以下のようなジェネレータを作るとカンタンです。
from itertools import islice
def dict_chunks(data, size):
it = iter(data)
for i in range(0, len(data), size):
yield {k:data[k] for k in islice(it, size)}
chunks = dict_chunks(data, size=3)
上の例では、chunks
変数に3要素ごとに分割後の辞書(ジェネレータ)が入ります。
作られたジェネレータで以下のようにfor文を回したり、1つずつ next()
することでも分割された要素を得られます。
count = 0
for c in chunks:
print(f"chunk {count}: {c.keys()}")
count += 1
# chunk 0: dict_keys([0, 1, 2])
# chunk 1: dict_keys([3, 4, 5])
# chunk 2: dict_keys([6, 7, 8])
# chunk 3: dict_keys([9])
上記 dict_chunks()
では、まず辞書をイテレータに変換し itertools.islice()
で一定範囲を抽出します。
抽出した範囲を配列に戻して yield
することで、擬似的に辞書を分割しています。
公式ドキュメントより
itertools.islice(iterable, stop)
itertools.islice(iterable, start, stop[, step])
iterable
から要素を選択して返すイテレータを作成します。start
が0でない場合、iterable
の要素はstart
に達するまでスキップされます。その後に要素が順に返されます。
ソート済み辞書のスライスを取得する
list(リスト)では、data[:10]
などのように範囲を指定して要素を取り出すことができますが、これと同じようなことを辞書でもできるのがislice()
のいいところ。
例えば、辞書をキー順にソートし、n番目のアイテムを取り出すという操作も可能。
data = { i:i**2 for i in range(10) }
it = iter(data)
# 6番目から最後まで抽出
chunk = next(islice(it, 6, None))
pprint.pprint(chunk) # 6
リストの分割
辞書ではなく、リストの分割についても再確認しておきましょう。
リストの分割はNumpyの array_split()
を使うのがカンタンで手っ取り早いです。
サンプルとしてこのようなリストがあるとします。
list_data = [ i for i in range(10)]
print(list_data)
#[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
array_split()
を使って3つに分割します。
import numpy as np
chunked_list = list(np.array_split(list_data, 3))
pprint.pprint(chunked_list, width=40)
# [array([0, 1, 2, 3]),
# array([4, 5, 6]),
# array([7, 8, 9])]
まとめ
今回は1つの辞書(dict変数)を複数に分割したりスライスを取得する方法を解説しました。
巨大な辞書を扱うときや、通信に制約がある時などに活用できるかもしれません。
参考にしたページ
isliceの紹介、具体例添え(pythonのitertoolsを使いこなすために)