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

Modified: | Tags: Python, リスト, 辞書

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

共通のキーを持つ辞書のリストはJSONを読み込むと頻繁に遭遇する。PythonでのJSONの読み書きは以下の記事を参照。

また、このような辞書のリストはデータ分析ライブラリpandasのpandas.DataFrameに変換できる。もろもろの処理をするのであればpandas.DataFrameに変換すると何かと便利。

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

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

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

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()メソッドはデフォルトではNoneを返す。

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

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

get()メソッドの第二引数に存在しない場合のデフォルト値を指定できる。

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]

Python3.8で導入された代入式(セイウチ演算子、ウォルラス演算子):=を使うと、get()の繰り返しを避けることができる。

l_point_ignore_walrus = [v for d in l if (v := d.get('Point'))]
print(l_point_ignore_walrus)
# [80, 70]

関連カテゴリー

関連記事