196 votes

Supprimer les dictées en double dans une liste en Python

J'ai une liste de dicts, et je voudrais enlever les dicts avec des paires de clés et de valeurs identiques.

Pour cette liste : [{'a': 123}, {'b': 123}, {'a': 123}]

J'aimerais rendre ça : [{'a': 123}, {'b': 123}]

Un autre exemple :

Pour cette liste : [{'a': 123, 'b': 1234}, {'a': 3222, 'b': 1234}, {'a': 123, 'b': 1234}]

J'aimerais rendre ça : [{'a': 123, 'b': 1234}, {'a': 3222, 'b': 1234}]

0 votes

Pouvez-vous nous en dire plus sur le problème réel que vous essayez de résoudre ? Cela semble être un problème étrange à avoir.

2 votes

Je combine quelques listes de dicts et il y a des doublons. J'ai donc besoin de supprimer ces doublons.

0 votes

J'ai trouvé une solution dans stackoverflow.com/questions/480214/ dans une réponse sans l'utilisation de set()

-1voto

Alec Points 143

Voici une solution rapide en une ligne avec une compréhension de liste doublement imbriquée (basée sur la solution de @Emmanuel).

Cela utilise une seule clé (par exemple, a ) dans chaque dict comme clé primaire, plutôt que de vérifier si le dict entier correspond à

[i for n, i in enumerate(list_of_dicts) if i.get(primary_key) not in [y.get(primary_key) for y in list_of_dicts[n + 1:]]]

Ce n'est pas ce que l'OP a demandé, mais c'est ce qui m'a amené à ce fil de discussion, alors j'ai pensé que je posterais la solution que j'ai trouvée.

-1voto

Harris Tailor Points 99

Je sais que ce n'est pas aussi élégant que les autres réponses, mais pourquoi ne pas essayer ceci ?

arts = list of dicts

arts_alt = []

arts_alt = [arts_alt.append(art) for art in arts if art not in arts_alt]

arts_alt est ce dont vous avez besoin

-1voto

A.J. Mayorga Points 37

Beaucoup de bons exemples de recherche de valeurs et de clés dupliquées, ci-dessous la façon dont nous filtrons les données dupliquées du dictionnaire entier dans les listes. Utilisez dupKeys = [] si vos données sources sont composées de dictionnaires au format EXACT et que vous recherchez des doublons. Sinon, définissez dupKeys = sur les noms des clés des données dont vous voulez éviter les doublons, de 1 à n clés. Ce n'est pas élégant, mais cela fonctionne et c'est très flexible.

import binascii

collected_sensor_data = [{"sensor_id":"nw-180","data":"XXXXXXX"},
                         {"sensor_id":"nw-163","data":"ZYZYZYY"},
                         {"sensor_id":"nw-180","data":"XXXXXXX"},
                         {"sensor_id":"nw-97", "data":"QQQQQZZ"}]

dupKeys = ["sensor_id", "data"]

def RemoveDuplicateDictData(collected_sensor_data, dupKeys):

    checkCRCs = []
    final_sensor_data = []

    if dupKeys == []:
        for sensor_read in collected_sensor_data:
            ck1 = binascii.crc32(str(sensor_read).encode('utf8'))
            if not ck1 in checkCRCs:
                final_sensor_data.append(sensor_read)
                checkCRCs.append(ck1)
    else:
        for sensor_read in collected_sensor_data:
            tmp = ""
            for k in dupKeys:
                tmp += str(sensor_read[k])

            ck1 = binascii.crc32(tmp.encode('utf8'))
            if not ck1 in checkCRCs:
                final_sensor_data.append(sensor_read)
                checkCRCs.append(ck1)

    return final_sensor_data    

 final_sensor_data = [{"sensor_id":"nw-180","data":"XXXXXXX"},
                      {"sensor_id":"nw-163","data":"ZYZYZYY"},
                      {"sensor_id":"nw-97", "data":"QQQQQZZ"}]

-2voto

user1723157 Points 75

Pas si court mais facile à lire :

list_of_data = [{'a': 123}, {'b': 123}, {'a': 123}]

list_of_data_uniq = []
for data in list_of_data:
    if data not in list_of_data_uniq:
        list_of_data_uniq.append(data)

Maintenant, liste list_of_data_uniq auront des dicts uniques.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X