note.nkmk.me

Pythonで辞書のリストから特定のキーの値のリストを取得

Date: 2018-05-19 / tags: Python, リスト, 辞書

Pythonで共通のキーを持つ辞書を要素とするリストから特定のキーの値のリストを取得する方法を説明する。

共通のキーを持つ辞書を要素とするリストを例にする。

l = [{'Name': 'Alice', 'Age': 40, 'Point': 80}, 
     {'Name': 'Bob', 'Age': 20},
     {'Name': 'Charlie', 'Age': 30, 'Point': 70}]

このような辞書のリストはJSONを読み込むと頻繁に遭遇する。PythonでのJSONの読み書きは以下の記事を参照。

なお、このような辞書のリストはデータ分析ライブラリpandasのpandas.DataFrameに変換することが可能。もろもろの処理をするのであればpandas.DataFrameに変換したほうが何かと便利。以下の記事を参照。

スポンサーリンク

リスト内包表記とgetメソッドで任意のキーの値を抽出

リスト内包表記と辞書のget()メソッドを使う。

l_name = [d.get('Name') for d in l]
print(l_name)
# ['Alice', 'Bob', 'Charlie']

l_age = [d.get('Age') for d in l]
print(l_age)
# [40, 20, 30]

l_point = [d.get('Point') for d in l]
print(l_point)
# [80, None, 70]

リスト内包表記、get()についてはそれぞれ以下の記事を参照。

共通のキーを持たない要素がある場合は注意

すべての要素が共通のキーを持っている場合はget(キー名)ではなく[キー名]で値を取得してもいいが、指定したキーを持たない要素が存在する場合にエラーになる。

l_name = [d['Name'] for d in l]
print(l_name)
# ['Alice', 'Bob', 'Charlie']

# l_point = [d['Point'] for d in l]
# KeyError: 'Point'

上の例のようにget()メソッドはデフォルトではキーが存在しないときはNoneを返す。

l_point = [d.get('Point') for d in l]
print(l_point)
# [80, None, 70]

第二引数にデフォルト値を指定することが可能。

l_point_default = [d.get('Point', 0) for d in l]
print(l_point_default)
# [80, 0, 70]

キーが存在しない要素を除外したい場合はリスト内包表記にifで条件を追加する。

l_point_ignore = [d.get('Point') for d in l if d.get('Point')]
print(l_point_ignore)
# [80, 70]
スポンサーリンク
シェア
このエントリーをはてなブックマークに追加

関連カテゴリー

関連記事