Python辞書の配列を重複排除するにはどうすればよいですか?

あなたは知っていますか?配列がディクショナリで構成されている場合は、setメソッドを直接使用して配列内のディクショナリを重複排除すると、エラーが報告されます。

test = [{"a": 1}, {"a": 1}, {"a": 3}, {"b": 4}]
test = list(set(test))
>>>TypeError: unhashable type: 'dict'

 

setを使用して重複を削除することの前提は、オブジェクトが不変オブジェクトであり、ディクショナリが可変オブジェクトであるため、このメソッドを直接使用して重複を削除することはできません。

では、この問題をどのように解決するのでしょうか?3つの方法があります。

画像

1.reduceメソッドを使用します

reduce() 関数は、パラメーターシーケンスの要素を累積します。

といった:

from functools import reduce
>>>def add(x, y) :            # 两数相加
...    return x + y
...
>>>reduce(add, [1,2,3,4,5]) # 计算列表和:1+2+3+4+5
15

 

上記の記述は、ラムダ関数を使用して次のように簡略化することもできます。

from functools import reduce
>>> reduce(lambda x, y: x+y, [1,2,3,4,5]) # 使用 lambda 匿名函数
15

 

したがって、配列内の辞書を重複排除する関数を記述します。

from functools import reduce

data = [{"a": 1}, {"a": 1}, {"a": 3}, {"b": 4}]
result = []
def unduplicate(result, data):
    if data not in result:
        result = result + [data]
    return result

for i in data:
    result = unduplicate(result, i)

>>> result
>>> [{'a': 1}, {'a': 3}, {'b': 4}]

 

もう少し複雑ですが、reduce関数とlambda関数を使用すると、コードを大幅に簡略化できます。

def delete_duplicate(data):
    func = lambda x, y: x + [y] if y not in x else x
    data = reduce(func, [[], ] + data)
    return data

>>> delete_duplicate(data)
>>> [{'a': 1}, {'a': 3}, {'b': 4}]

 

もちろん、この関数を1行で書くこともできます。

data = reduce(lambda x, y: x + [y] if y not in x else x, [[], ] + data)

 

ワークステーションで殺されるかもしれないというだけなので、これはお勧めできません。

画像

2.奇妙なトリック

記事の冒頭で述べたように、辞書を使用してセットを重複排除できない理由は、それが可変オブジェクトであるためです。

しかし...それを不変オブジェクトにするとどうなるでしょうか?

data = [{"a": 1}, {"a": 1}, {"a": 3}, {"b": 4}]
def delete_duplicate(data):
    immutable_dict = set([str(item) for item in data])
    data = [eval(i) for i in immutable_dict]
    return data
>>> delete_duplicate(data)
>>> [{'a': 1}, {'a': 3}, {'b': 4}]

 

はい、できます。

画像

1.辞書をトラバースし、各サブアイテムを配列内の文字列に格納してから、set関数を使用して重複を削除します。

2. eval関数を使用して、重複排除された配列の各サブアイテムが辞書に変換されます。

Pythonはどうしてこんなに楽しいのでしょうか?

 

3.効率的な方法

上記の2つのSao操作は、実際の作業で使用することは実際には推奨されていません。

理由の1つは、私が本当に生意気すぎて、殴られて机の上に横たわるのが怖かったことです。

もう1つの理由は、大量のデータを処理するときにパフォーマンスが低下することです。

以下は、最もオーソドックスな方法です。

data = [dict(t) for t in set([tuple(d.items()) for d in data])]
>>>data
>>>[{'a': 1}, {'b': 2}]

私はまだ自分で構築したPython開発学習QQグループをお勧めしたいと思います:705933274(使用するコードファイルとデータを取得できます)、グループはすべてPython開発を学習しています、Pythonを学習したい、または学習している場合は、大歓迎です参加してください、誰もがソフトウェア開発パーティーであり、2021年に私が編集した最新のPythonの高度な資料と高度な開発チュートリアルのコピーを含む(Pythonソフトウェア開発にのみ関連する)乾物を時々共有しています。 Pythonフレンズ!

実際、2番目の方法と同じように、配列内の各ディクショナリをタプル、つまり不変オブジェクトに変換してから、setを使用して重複を削除します。重複排除が完了したら、dict関数を使用して、タプルを辞書のペアに再アセンブルします。

ただし、この方法はディクショナリ内のディクショナリのデータ構造には適用できないため、次のようにディクショナリペア内のディクショナリの重複排除を行います。

data2 = [{"a": {"b": "c"}}, {"a": {"b": "c"}}]

 

この場合、2番目の方法を使用して重複を削除することをお勧めします。

data2 = [{"a": {"b": "c"}}, {"a": {"b": "c"}}]
def delete_duplicate_str(data):
    immutable_dict = set([str(item) for item in data])
    data = [eval(i) for i in immutable_dict]
    return data
print(delete_duplicate_str(data2))

>>> [{'a': {'b': 'c'}}]

 

これら3つの方法をすべて学びましたか?

やりがいがあると思うなら、忘れずに集めてください。将来、同様の重複排除シーンに遭遇したときに読むことができます。

 

おすすめ

転載: blog.csdn.net/aaahtml/article/details/115055612