9
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【Python】辞書の重複を排除する

Posted at

備忘録です。
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'}]

これで辞書型のリストから重複した値を排除することができました。

9
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?