【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]
そもそも前提が間違えていた場合は、そのときに考え直します。
コメント
コメントを投稿