Python Tech 辞書

Pythonで辞書dictを分割する方法、任意のスライスを作る方法

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(iterablestop)

itertools.islice(iterablestartstop[, 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を使いこなすために)

 

  • この記事を書いた人

次世代ペンギン

長いのでペンギンとお呼びください。システム開発・プログラミングのお仕事をしています。甘味とコーヒーは生命線。多くの人に役立つ情報のシェアが目標です。

人気の記事

1

会社員でプログラマーとして働いている人、インフラやネットワークのエンジニアとして働いている人の中には、フリーランスのプログラマーとして独立、もしくは転向したい人もいるので ...

2

キャリアアップのため、または高収入を目指して、しっかりプログラミングを学びたいという人が増えてきましたね。 この記事では現役のエンジニアである私が、実際に仕事で稼げるよう ...

3

フリーランスのプログラマーにとって収入の向上に最も直結するのはスキルです。 必要なスキル、スキルの獲得方法が気になる人も多いでしょう。 また、これからフリーランスを目指す ...

4

Vuetifyの v-progress-circular コンポーネントは、数値データや処理状況を環状(円状)のデザインで教えてくれるUIデザインです。 ローディングのス ...

5

Vuexのstore(ストア)を使うと、各コンポーネント間で個別にデータのやり取りすることなく、データを一元的に管理できます。Vueでは欠かせない機能といえるでしょう。 ...

-Python, Tech, 辞書
-,