備忘録です。
Pythonの辞書型のリストから、重複する値を排除する方法に困ったので残しておきます。
前提
以下のようなリストから重複したものを排除したいです。
user_list = [
{"id": 1, "name": "Alice", "age": 25},
{"id": 2, "name": "Bob", "age": 30},
{"id": 3, "name": "Charlie", "age": 35},
{"id": 1, "name": "Alice", "age": 27},
{"id": 4, "name": "David", "age": 40},
{"id": 2, "name": "Bob", "age": 32},
]
エラーが出る例
set型に変換して、重複排除することはできません。
unique_user_list = list(set(user_list))
エラー内容
TypeError: unhashable type: 'dict'
解決策
ジェネレータ式を使用して、一意のキーの辞書を作成します。
unique_user_list = list({user["id"]: user for user in user_list}.values())
pprint(unique_user_list)
出力結果
[{'age': 27, 'id': 1, 'name': 'Alice'},
{'age': 32, 'id': 2, 'name': 'Bob'},
{'age': 35, 'id': 3, 'name': 'Charlie'},
{'age': 40, 'id': 4, 'name': 'David'}]
関数に切り出す
id
だけでなく任意のキーで重複を排除できるようにします。
def distinct_by_key(data: list[dict], key: str) -> list[dict]:
return list({element[key]: element for element in data}.values())
unique_user_list = distinct_by_key(user_list, "id")
pprint(unique_user_list)
出力結果
[{'age': 27, 'id': 1, 'name': 'Alice'},
{'age': 32, 'id': 2, 'name': 'Bob'},
{'age': 35, 'id': 3, 'name': 'Charlie'},
{'age': 40, 'id': 4, 'name': 'David'}]
これで辞書型のリストから重複した値を排除することができました。