【Python】辞書から重複した要素を削除する

Pythonの辞書(dictionary)は、キーと値のペアを管理する便利なデータ構造ですが、データが重複してしまうことがあります。

この記事では、辞書から重複した要素を削除する方法について、初心者向けにわかりやすく解説します。

キーや値の重複を削除する方法や、辞書のリストやネストされた辞書から重複を取り除く方法も紹介します。

目次から探す

重複要素を削除する方法

Pythonの辞書(dictionary)はキーと値のペアを保持するデータ構造です。

しかし、データの重複が発生することがあります。

この記事では、辞書から重複した要素を削除する方法について解説します。

キーの重複を削除する

辞書においてキーが重複する場合、Pythonは最後に出現したキーとその値を保持します。

以下では、キーの重複を削除する方法を2つ紹介します。

最後に出現したキーを保持する方法

Pythonの辞書は、同じキーが複数回出現した場合、最後に出現したキーとその値を保持します。

以下の例を見てみましょう。

# 重複するキーを持つ辞書
data = {'a': 1, 'b': 2, 'a': 3}
# 最後に出現したキー 'a' の値が保持される
print(data)  # {'a': 3, 'b': 2}

このように、辞書に重複するキーが存在する場合、最後に出現したキーの値が保持されます。

最初に出現したキーを保持する方法

最初に出現したキーを保持するためには、辞書を手動で処理する必要があります。

以下の例では、最初に出現したキーを保持する方法を示します。

# 重複するキーを持つ辞書
data = [('a', 1), ('b', 2), ('a', 3)]
# 最初に出現したキーを保持する辞書を作成
unique_data = {}
for key, value in data:
    if key not in unique_data:
        unique_data[key] = value
print(unique_data)  # {'a': 1, 'b': 2}

この方法では、最初に出現したキーとその値を保持する辞書を作成します。

値の重複を削除する

次に、辞書の値が重複する場合の対処方法について説明します。

値の重複を検出する方法

まず、辞書の値が重複しているかどうかを検出する方法を見てみましょう。

以下の例では、値の重複を検出する方法を示します。

# 辞書の値が重複しているかを検出する
data = {'a': 1, 'b': 2, 'c': 1}
# 値の重複を検出
values = list(data.values())
duplicates = set([x for x in values if values.count(x) > 1])
print(duplicates)  # {1}

この方法では、辞書の値が重複しているかどうかを検出し、重複している値をセットとして取得します。

重複する値を持つキーを削除する方法

最後に、重複する値を持つキーを削除する方法を紹介します。

以下の例では、重複する値を持つキーを削除する方法を示します。

# 重複する値を持つキーを削除する
data = {'a': 1, 'b': 2, 'c': 1}
# 重複する値を持つキーを削除
unique_data = {}
seen_values = set()
for key, value in data.items():
    if value not in seen_values:
        unique_data[key] = value
        seen_values.add(value)
print(unique_data)  # {'a': 1, 'b': 2}

この方法では、重複する値を持つキーを削除し、最初に出現した値を保持する辞書を作成します。

以上が、Pythonの辞書から重複した要素を削除する方法です。

これらの方法を活用して、効率的にデータを管理しましょう。

応用例

辞書のリストから重複要素を削除する

辞書のリストから重複要素を削除する場合、リスト内の各辞書を比較して重複を検出し、削除する必要があります。

ここでは、リスト内の辞書が同じキーと値のペアを持つ場合に重複とみなします。

以下に、辞書のリストから重複要素を削除する方法を示します。

# 辞書のリスト
dict_list = [
    {"name": "Alice", "age": 25},
    {"name": "Bob", "age": 30},
    {"name": "Alice", "age": 25},
    {"name": "Charlie", "age": 35}
]
# 重複を削除する
unique_dict_list = []
seen = set()
for d in dict_list:
    # frozensetを使って辞書をハッシュ可能な形に変換
    dict_tuple = frozenset(d.items())
    if dict_tuple not in seen:
        seen.add(dict_tuple)
        unique_dict_list.append(d)
print(unique_dict_list)

このコードでは、frozensetを使用して辞書をハッシュ可能な形に変換し、setを使って重複を検出しています。

実行結果は以下の通りです。

[{'name': 'Alice', 'age': 25}, {'name': 'Bob', 'age': 30}, {'name': 'Charlie', 'age': 35}]

ネストされた辞書から重複要素を削除する

ネストされた辞書から重複要素を削除する場合、再帰的に辞書を走査して重複を検出し、削除する必要があります。

ここでは、ネストされた辞書の中で同じキーと値のペアを持つ場合に重複とみなします。

以下に、ネストされた辞書から重複要素を削除する方法を示します。

def remove_duplicates(d):
    if isinstance(d, dict):
        unique_dict = {}
        seen = set()
        for key, value in d.items():
            if isinstance(value, dict):
                value = remove_duplicates(value)
            dict_tuple = frozenset({key: value}.items())
            if dict_tuple not in seen:
                seen.add(dict_tuple)
                unique_dict[key] = value
        return unique_dict
    return d
# ネストされた辞書
nested_dict = {
    "person1": {"name": "Alice", "age": 25},
    "person2": {"name": "Bob", "age": 30},
    "person3": {"name": "Alice", "age": 25},
    "person4": {"name": "Charlie", "age": 35}
}
# 重複を削除する
unique_nested_dict = remove_duplicates(nested_dict)
print(unique_nested_dict)

このコードでは、再帰的に辞書を走査し、frozensetを使用して重複を検出しています。

実行結果は以下の通りです。

{'person1': {'name': 'Alice', 'age': 25}, 'person2': {'name': 'Bob', 'age': 30}, 'person4': {'name': 'Charlie', 'age': 35}}

このようにして、ネストされた辞書からも重複要素を削除することができます。

目次から探す