Disons que j'ai une liste de dictionnaires:
[
{'id': 1, 'name': 'john', 'age': 34},
{'id': 1, 'name': 'john', 'age': 34},
{'id': 2, 'name': 'hanna', 'age': 30},
]
et j'ai besoin d'obtenir une liste de dictionnaires uniques (en supprimant les doublons):
[
{'id': 1, 'name': 'john', 'age': 34},
{'id': 2, 'name': 'hanna', 'age': 30},
]
Quelqu'un peut-il m'aider avec le moyen le plus efficace d'y parvenir en Python?
python
dictionary
Limaaf
la source
la source
set(frozenset(i.items()) for i in list)
Réponses:
Alors faites un dict temporaire avec la clé étant le
id
. Cela filtre les doublons. levalues()
du dict sera la listeEn Python2.7
En Python3
En Python2.5 / 2.6
la source
{str(v['flight'])+':'+str(v['lon'])+','+str(v['lat']): v for v in stream}.values()
Cela crée simplement une clé unique basée sur vos valeurs. J'aime'MH370:-21.474370,86.325589'
{(v['flight'], v['lon'], v['lat']): v for v in stream}.values()
OrderedDict
partircollections
list(OrderedDict((v['id'], v) for v in L).values())
ou trier la liste des résultats si cela fonctionne mieux pour vouslist({str(i):i for i in L}.values())
Ici, nous utilisons str (i) pour créer une chaîne unique qui représente le dictionnaire utilisé pour filtrer les doublons.La façon habituelle de trouver uniquement les éléments communs dans un ensemble est d'utiliser la
set
classe de Python . Ajoutez simplement tous les éléments à l'ensemble, puis convertissez l'ensemble en alist
, et bam les doublons ont disparu.Le problème, bien sûr, est que a
set()
ne peut contenir que des entrées hachables, et adict
n'est pas hachable.Si j'avais ce problème, ma solution serait de convertir chacun
dict
en une chaîne qui représente ledict
, puis d'ajouter toutes les chaînes à a,set()
puis de lire les valeurs de chaîne en tant que alist()
et de les reconvertir endict
.Une bonne représentation d'un
dict
sous forme de chaîne est le format JSON. Et Python a un module intégré pour JSON (appeléjson
bien sûr).Le problème restant est que les éléments de a
dict
ne sont pas ordonnés, et lorsque Python convertit ledict
en une chaîne JSON, vous pouvez obtenir deux chaînes JSON qui représentent des dictionnaires équivalents mais ne sont pas des chaînes identiques. La solution simple est de passer l'argumentsort_keys=True
lorsque vous appelezjson.dumps()
.EDIT: Cette solution supposait qu'une donnée
dict
pouvait avoir n'importe quelle partie différente. Si nous pouvons supposer que tousdict
avec la même"id"
valeur correspondront à tous les autresdict
avec la même"id"
valeur, alors c'est exagéré; La solution de @ gnibbler serait plus rapide et plus simple.EDIT: Maintenant, il y a un commentaire d'André Lima disant explicitement que si l'ID est un double, il est prudent de supposer que le tout
dict
est un double. Donc, cette réponse est exagérée et je recommande la réponse de @ gnibbler.la source
Dans le cas où les dictionnaires ne sont identifiés que de manière unique par tous les éléments (l'ID n'est pas disponible), vous pouvez utiliser la réponse en utilisant JSON. Ce qui suit est une alternative qui n'utilise pas JSON et fonctionnera tant que toutes les valeurs du dictionnaire sont immuables
la source
Vous pouvez utiliser la bibliothèque numpy (fonctionne uniquement pour Python2.x):
Pour le faire fonctionner avec Python 3.x (et les versions récentes de numpy), vous devez convertir un tableau de dictées en tableau numpy de chaînes, par exemple
la source
TypeError: unorderable types: dict() > dict()
en faisant cela dans Python 3.5.Voici une solution raisonnablement compacte, même si je soupçonne qu'elle n'est pas particulièrement efficace (pour le moins dire):
la source
map()
appel aveclist()
dans Python 3 pour récupérer une liste, sinon c'est unmap
objet.Puisque le
id
est suffisant pour détecter les doublons et qu'ilid
est hachable: exécutez-les dans un dictionnaire qui aid
comme clé. La valeur de chaque clé est le dictionnaire d'origine.En Python 3,
values()
ne renvoie pas de liste; vous aurez besoin d'envelopper tout le côté droit de cette expressionlist()
, et vous pouvez écrire la viande de l'expression de manière plus économique comme une compréhension de dict:Notez que le résultat ne sera probablement pas dans le même ordre que l'original. Si c'est une exigence, vous pouvez utiliser un
Collections.OrderedDict
au lieu d'undict
.En passant, il peut être très judicieux de simplement conserver les données dans un dictionnaire qui utilise la
id
clé as pour commencer.la source
les sorties:
la source
Extension de la réponse de John La Rooy ( Python - Liste de dictionnaires uniques ), ce qui la rend un peu plus flexible:
Fonction d'appel:
la source
On peut faire avec
pandas
Remarquez légèrement différent de la réponse d'acceptation.
drop_duplicates
vérifiera toutes les colonnes des pandas, si elles sont toutes identiques, la ligne sera supprimée.Par exemple :
Si nous changeons le 2ème
dict
nom de John en Peterla source
En python 3.6+ (ce que j'ai testé), utilisez simplement:
Explication: nous mappons le
json.dumps
pour encoder les dictionnaires en tant qu'objets json, qui sont immuables.set
peut ensuite être utilisé pour produire un itérable d' immuables uniques . Enfin, nous retournons à notre représentation de dictionnaire en utilisantjson.loads
. Notez qu'au départ, il faut trier par clés pour disposer les dictionnaires sous une forme unique. Ceci est valable pour Python 3.6+ puisque les dictionnaires sont classés par défaut.la source
list
avant de le faireset
.J'ai résumé mes favoris pour essayer:
https://repl.it/@SmaMa/Python-List-of-unique-dictionaries
la source
Une solution rapide et sale consiste simplement à générer une nouvelle liste.
la source
Je ne sais pas si vous voulez seulement que l'identifiant de vos dictés dans la liste soit unique, mais si le but est d'avoir un ensemble de dict où l'unicité est sur les valeurs de toutes les clés ... vous devez utiliser la clé tuples comme celle-ci dans votre compréhension:
J'espère que cela vous aidera ou aidera une autre personne à vous inquiéter ....
la source
Il y a beaucoup de réponses ici, alors laissez-moi en ajouter une autre:
la source
Option assez simple:
la source
Eh bien, toutes les réponses mentionnées ici sont bonnes, mais dans certaines réponses, on peut faire face à une erreur si les éléments du dictionnaire ont une liste ou un dictionnaire imbriqués, donc je propose une réponse simple
la source
Voici une implémentation avec peu de surcharge de mémoire au prix de ne pas être aussi compacte que le reste.
production:
la source
index
parlen(values)
et à compter à rebours, cela signifie que vous pouvez toujours décrémenter,index
que vous soyezdel
ou non. egfor index in reversed(range(len(values))):
Voici la solution que j'ai trouvée:
En gros, vous vérifiez si l'ID est présent dans la liste, si c'est le cas, supprimez le dictionnaire, sinon, ajoutez l'ID à la liste
la source