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]
Last Updated: 6/26/2019, 10:34:03 PM