Pythonでは、辞書(dictionary)は一般的に一意のキーを持つことが期待されています。しかし、複数の辞書をマージする際や特定のデータ処理を行う際に、キーの重複が発生することがあります。この記事では、Pythonで辞書の重複キーを扱う方法について説明します。
重複キーのマージ
Pythonの辞書では、同じキーが存在する場合、後から追加された値で上書きされます。しかし、上書きせずに複数の値を保持したい場合もあります。そのような場合、以下のようなコードを使用することができます。
from collections import defaultdict
def merge_dict_values(*dicts):
r = defaultdict(list) # listに変更し
for d in dicts:
for k, v in d.items():
if v not in r[k]: # この値がない場合追加します
r[k].append(v)
return r
dic = {'A':'1', 'B':'2'}
dic1 = {'A':'3', 'B':'2', 'C':'4'}
dic_merged = merge_dict_values(dic, dic1)
print(dic_merged) # {'A': ['1', '3'], 'B': ['2'], 'C': ['4']}
このコードでは、defaultdict
を使用して新しい辞書を作成し、各辞書のキーと値を追加しています。値はリストとして保持され、重複する値は追加されません。
重複キーの排除
一方、辞書のリストから重複する値を排除する方法もあります。以下のコードでは、ジェネレータ式を使用して一意のキーの辞書を作成し、その値をリストとして返しています。
def distinct_by_key(data: list[dict], key: str) -> list[dict]:
return list({element[key]: element for element in data}.values())
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},
]
unique_user_list = distinct_by_key(user_list, "id")
print(unique_user_list) # [{'id': 1, 'name': 'Alice', 'age': 27}, {'id': 2, 'name': 'Bob', 'age': 32}, {'id': 3, 'name': 'Charlie', 'age': 35}, {'id': 4, 'name': 'David', 'age': 40}]
以上、Pythonで辞書の重複キーを扱う方法について説明しました。これらのテクニックを使うことで、より複雑なデータ処理を行うことが可能になります。