注目キーワード

【Python】辞書(dict)データの中身に応じてデータをfilterする(filter関数と内包表記)

Pythonの辞書データはキー (key) と値 (value) の組で多種多様なデータを格納でき、応用範囲が広いデータ型です。

様々なデータを格納することができるため、データの中で「ある条件を満たすもの」などのちょっとした検索処理を行うことがよくあります。こちらの記事ではfilterとdictの内包表記を利用して、ちょっとした処理を行う方法を説明します。

データの準備

こちらの記事で例に利用した辞書データ(都道府県3つの人口と面積)を利用します。同様にデータを data.json として保存し、カレントディレクトリに保存しています。こちらからコピーして保存しても良いです。

{ "1": {  "name": "北海道",  "area": 83450,  "population": 528.1 }, "2":{  "name": "青森",  "area": 9646,  "population": 124.9 }, "3": {  "name": "岩手",  "area": 15280,  "population": 122.9 }}

辞書データのキー・値の対を取得する

基本的な操作から振り返ります。辞書データに対してitems()を呼び出すことで、キーと値の対を取得することができます。

サンプルソース

データを読み込んで、キーと値の対を取得するサンプルの実装です。

実行結果

次のようになります。上で用意したサンプルのデータから、key-valueのペアが取得できています。

key-valueペア(dict_items)を取得した様子

filterと内包表記を用いてデータを絞り込む

繰り返し (for文) が使える場合に、条件を満たすペアだけを絞り込む操作を考えます。このような処理はfilterと呼ばれています。こちらではfilterという関数を使う方法と、より短く辞書の内包表記を使う手法を紹介します。

サンプルソース

サンプルの実装です。どちらも「都道府県番号が奇数のデータ」を抽出しています。

1つ目の処理では、filter関数をかけた結果をdict()に渡して辞書型データを作成します。filter関数は1つ目の引数にラムダ式を与え、キーとアイテムの対のうちキーの方をintに変換して奇数判定を行います。この処理を2つ目の引数であるdata.items()全部に適用します。

2つ目の処理では、上の操作を内包処理で書いています。こちらの方がスッキリして書けます。for文を辞書宣言の中に利用して、if以下にラムダ式と同様に条件式を記述します。ここではキーの方だけ利用したので、内包表記も簡単にキーだけのfor文を使いました。

実行結果

実行結果です。都道府県番号が奇数のデータだけ抽出することができました。

フィルタした結果

キー側と値側の条件を両方使うサンプルソース

先程はキー側の条件だけ使いましたが、キーと値側の両方の条件を書くことも可能です。ここでは「都道府県番号が奇数」かつ「面積が20000未満」の条件を書いてみました。

スポンサーリンク

実行結果

北海道が除外され、岩手だけ残った新しい辞書型データを作成することができました。

キーと値の両方でフィルタしたサンプルの結果

データを条件によって抽出して処理を行う操作はいろんなプログラムで使うことになる基本的な操作です。是非使いやすい方法・読みやすい書き方を選んで、使ってみてください。