【python】dict型オブジェクトに対するfor in

for in の挙動

list型やdict型のオブジェクトに対して for in を使って中の値を取得できます。 dict型については、例えばJOSN形式のファイルだったとして、特定のキー配下のデータだけを取得したい場合、dictionarys['key']みたいな書き方をすると思いますが、それがうまくいかないことがあります。

以下のデータは、NISTが公開しているNVDデータベースの一部です。

dct_cvechanges:{'change': {'cveId': 'CVE-2024-43047', 'eventName': 'CPE Deprecation Remap', 'cveChangeId': 'F8249569-C61B-44D4-A51E-C92727A312C6', 'sourceIdentifier': 'nvd@nist.gov', 'created': '2025-08-11T15:06:17.607', 'details': [{'action': 'Changed', 'type': 'CPE Configuration', 'oldValue': 'OR\r\n *cpe:2.3:o:qualcomm:video_collaboration_vc1_firmware:-:*:*:*:*:*:*:*', 'newValue': 'OR\r\n *cpe:2.3:o:qualcomm:video_collaboration_vc1_platform_firmware:-:*:*:*:*:*:*:*'}]}}

 これに対して、キー'change'部分のdict型オブジェクトが取得したいので、以下の通りコーディングをしました。

for change_layer in dct_cvechanges:

すると、結果は以下の通りとなります。

# ダンプ用のprint print(f"change_layer:{change_layer}") # 出力結果 change_layer:change

ChatGPTさんの回答がこちら。

この場合、dct_cvechanges は辞書なので、
ループ変数 change_layer には キー が順番に入ります。
今回の dct_cvechanges は "change": { ... } なので、ループは 1回だけ 回って、change_layer == "change" になります。 「なぜ str になるのか」 ・dct_cvechanges は dict ・for ... in dict: はデフォルトで キーのリスト を返す ・そのキーは "change" という文字列 → だから str 型の "change" が出てくる

はい。すみませんでした。
単純にdict型に対してfor inしたらキーしか返ってこないことを忘れておりました...

NVDのデータは、値に配列が含まれていたり、辞書型のデータが格納されていたりします。
いったん、辞書型のデータはループする必要がないという前提を置いて以下の通りコーディングします。

if self.KEY_CHANGE in dct_cvechanges: dct_cve_changes = dct_cvechanges[self.KEY_CHANGE]

そもそも前提が間違えていた場合は、そのときに考え直します。

コメント

このブログの人気の投稿

【python】PySide6 におけるウィンドウとかダイアログボックス内のアイテムの自動調整

脆弱性評価システムを作る〜CVSSとは〜

dict型オブジェクトを内包するlistオブジェクトのコピー