¿Cómo eliminar la duplicación de la matriz de diccionarios de Python?

¿Lo sabías? Si la matriz está compuesta de diccionarios, use directamente el método set para eliminar los duplicados de los diccionarios en la matriz y se informará un error:

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

 

Debido a que la premisa de usar set para eliminar la duplicación es que el objeto es un objeto inmutable y el diccionario es un objeto mutable, no puede usar este método directamente para eliminar duplicados.

Entonces, ¿cómo resolver este problema? Hay tres formas.

Imagen

1. Utilice el método de reducción

La función reduce ()  acumula los elementos en la secuencia de parámetros.

tal como:

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

 

La escritura anterior también se puede simplificar con la función lambda para:

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

 

Por lo tanto, escribimos una función para desduplicar el diccionario en la matriz:

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}]

 

Un poco más complicado, si usa la función reducir y la función lambda, el código se puede simplificar mucho:

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}]

 

Por supuesto, también puedo escribir esta función en una línea:

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

 

Es solo que es posible que lo maten en la estación de trabajo, por lo que no se recomienda.

Imagen

2. Trucos extraños

Como se mencionó al principio del artículo, la razón por la que un diccionario no puede usarse para desduplicar un conjunto es porque es un objeto mutable.

Pero ... ¿y si lo convertimos en un objeto inmutable?

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}]

 

Sí, se puede hacer.

Imagen

1. Recorra el diccionario, almacene cada subelemento en una cadena en la matriz y luego use la función set para eliminar los duplicados.

2. A través de la función eval, cada subelemento de la matriz deduplicada se vuelve a convertir al diccionario.

¿Cómo puede ser tan divertido Python?

 

3. La forma eficiente

En realidad, no se recomienda el uso de las dos operaciones de Sao mencionadas anteriormente en el trabajo real.

Una de las razones es que era demasiado atrevida y tenía miedo de que me golpearan y me tumbaran en el escritorio.

Otra razón es que tienen un rendimiento deficiente cuando se trata de grandes cantidades de datos.

La siguiente es la forma más ortodoxa:

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

Todavía quiero recomendar el grupo de QQ de aprendizaje de desarrollo de Python que construí por mí mismo : 705933274 (puede obtener los archivos de código y los datos utilizados), el grupo está aprendiendo el desarrollo de Python, si desea aprender o está aprendiendo Python, de nada. Únase, todo el mundo es un grupo de desarrollo de software, compartiendo productos secos de vez en cuando (solo relacionado con el desarrollo de software Python), incluida una copia de los últimos materiales avanzados de Python y tutoriales de desarrollo avanzados compilados por mí en 2021, bienvenidos a avanzar y participar ¡Amigos de Python!

De hecho, lo mismo que el segundo método es convertir cada diccionario de la matriz en una tupla, es decir, un objeto inmutable, y luego usar set para eliminar los duplicados. Una vez completada la deduplicación, utilice la función dict para volver a ensamblar las tuplas en un par de diccionario.

Sin embargo, este método no es aplicable a la estructura de datos del diccionario en el diccionario, por lo que la deduplicación del diccionario en el par de diccionarios, como por ejemplo:

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

 

En este caso, sugiero usar el segundo método para eliminar duplicados:

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'}}]

 

¿Qué tal si has aprendido estos tres métodos?

Si crees que es gratificante, recuerda recogerlo. Puede leerlo cuando encuentre escenas de deduplicación similares en el futuro.

 

Supongo que te gusta

Origin blog.csdn.net/aaahtml/article/details/115055612
Recomendado
Clasificación