Header Logo
Ⓒ 2024- @itatibs
[Python]辞書型のネストの中にあるkey-valueの条件にあった親のkeyをリストで抽出する

Category: tech
Tags(仮): Python,辞書,リスト内包表記
Date: 2021/5/25

やりたいこと

カオスな題名ですが、やりたいこととしては

ds = {'id001': {'attr1': 'AAA', 'attr2': 'aaa'}, 'id002': {'attr1': 'BBB', 'attr2': 'bbb'}, 'id003': {'attr1': 'AAA', 'attr2': 'ccc'}}

のような辞書があったとき、attr1=AAAのときに['id001', 'id003']のようなリストを取得したい。

結論

以下のように辞書をループで回して対応する値を取得するイメージで対応する。

>>> [d for d in ds if ds[d]['attr1'] == 'AAA'] ['id001', 'id003']

ループの中身を確認する

辞書dsは単純にループすると、トップのkeyが取得できます。

>>> for d in ds: ... print(d) ... id001 id002 id003

ネストされた辞書は階層で指定していけば良いので

>>> for d in ds: ... print(ds[d]) ... {'attr2': 'aaa', 'attr1': 'AAA'} {'attr2': 'bbb', 'attr1': 'BBB'} {'attr2': 'ccc', 'attr1': 'AAA'} >>> for d in ds: ... print(ds[d]['attr1']) ... AAA BBB AAA

というようにアクセスすることができます。

目的のvalueまでアクセスすることができたため、あとはifを使って条件を指定してあげることで、対応するkeyのみを出力することができます。

>>> for d in ds: ... if ds[d]['attr1'] == 'AAA': ... print(d) ... id001 id003

ここまでを、リスト内包表記を使えば1行で、リスト型として取得することができます。

>>> [d for d in ds if ds[d]['attr1'] == 'AAA'] ['id001', 'id003'] >>> [d for d in ds if ds[d]['attr2'] == 'aaa'] ['id001']

辞書やJSONは持ち方が便利ですが、いざ取り出す時の操作がすぐ出てこなかったりするので、やりたいことを整理してから検討したいと思います。