Python - Liste des dictionnaires
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 des dictionnaires (en supprimant les doublons):
[
{'id': 1, 'name': 'john', 'age': 34},
{'id': 2, 'name': 'hanna', 'age': 30},
]
Quelqu'un peut m'aider avec la façon la plus efficace d'atteindre cet objectif en Python?
- Quelle est l'ampleur de ces dictionnaires? Avez-vous besoin d'attribut individuel vérification pour déterminer les doublons, ou est en train de vérifier une seule valeur en eux-ils suffisants?
- Ces dicts obtenu 8 clé:valeur des paires et de la liste des 200 dicts. Ils ont effectivement obtenu un ID et il est sûr pour moi de supprimer le dict de la liste si la si la valeur trouvée est un doublon.
- Double Possible de Comment faire pour mettre les valeurs dans la liste de dictionnaire unique?
- forzenset c'est une option efficace.
set(frozenset(i.items()) for i in list)
Vous devez vous connecter pour publier un commentaire.
Faire un temporaire dict avec à la clé la
id
. Cela permet de filtrer les doublons.Le
values()
de la dict sera la listeEn Python2.7
En Python3
En Python2.5/2.6
{str(v['flight'])+':'+str(v['lon'])+','+str(v['lat']): v for v in stream}.values()
Cela crée une clé unique en fonction de vos valeurs. Comme'MH370:-21.474370,86.325589'
{(v['flight'], v['lon'], v['lat']): v for v in stream}.values()
OrderedDict
decollections
list(OrderedDict((v['id'], v) for v in L).values())
ou de tri de la liste si cela fonctionne mieux pour vousLa manière habituelle pour trouver les éléments communs d'un ensemble est d'utiliser Python
set
classe. Ajouter tous les éléments de l'ensemble, puis de convertir l'ensemble à unlist
, et bam les doublons sont partis.Le problème, bien sûr, c'est qu'un
set()
ne peut contenir que des hashable entrées, et undict
n'est pas hashable.Si j'ai eu ce problème, ma solution serait de convertir chaque
dict
dans une chaîne de caractères qui représente ledict
, puis ajoutez toutes les chaînes à uneset()
puis la lecture de la chaîne de valeurs comme unlist()
et de convertir retour àdict
.Une bonne représentation d'un
dict
dans la forme d'une chaîne est le format JSON. Et Python a intégré dans le module JSON (appeléjson
bien sûr).Le problème reste que les éléments dans un
dict
ne sont pas commandés, et quand Python convertit ledict
à une chaîne JSON, vous pourriez obtenir deux chaînes JSON qui représentent l'équivalent des dictionnaires, mais ne sont pas identiques cordes. La solution facile est de passer l'argumentsort_keys=True
lorsque vous appelezjson.dumps()
.EDIT: Cette solution est à supposer qu'un
dict
peut avoir un rôle différent. Si nous pouvons supposer que chaquedict
avec la même"id"
de la valeur de correspondre à tous les autresdict
avec la même"id"
valeur, alors c'est exagéré; @gnibbler la solution serait plus rapide et plus facile.EDIT: Maintenant, il y a un commentaire d'André Lima qui dit explicitement que si l'ID est un doublon, il est sûr de supposer que l'ensemble de la
dict
est un doublon. Si cette réponse est exagéré, et je recommande @gnibbler de réponse.Vous pouvez utiliser numpy bibliothèque (pour Python2.x uniquement):
Pour l'obtenir, il a travaillé avec Python 3.x (et les versions récentes de numpy), vous devez convertir le tableau des dicts de numpy tableau de chaînes de caractères, par exemple
TypeError: unorderable types: dict() > dict()
lors de cette opération Python 3.5.Dans le cas où les dictionnaires ne sont identifiés de manière unique par tous les éléments (ID n'est pas disponible), vous pouvez utiliser la réponse à l'aide de JSON. Ce qui suit est une alternative à ne pas utiliser JSON, et de travailler aussi longtemps que toutes les dictionnaire les valeurs sont immuables
Voici raisonnablement une solution compacte, bien que je soupçonne pas particulièrement efficace (c'est un euphémisme):
map()
appel aveclist()
en Python 3 pour obtenir une liste de revenir, sinon, c'est unmap
objet.Depuis le
id
est suffisante pour détecter les doublons et lesid
est hashable: run 'em par le biais d'un dictionnaire qui a leid
comme la clé. La valeur de chaque clé est le dictionnaire d'origine.En Python 3,
values()
ne retourne pas une liste; vous en aurez besoin pour envelopper l'ensemble de la droite de cette expression dans leslist()
, et vous pouvez écrire la viande de l'expression de la plus économiquement comme dict compréhension:À noter 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 aparté, il peut faire une bonne affaire de sens à garder les données dans un dictionnaire qui utilise le
id
comme la clé pour commencer.sorties:
Expansion sur John La Rooy (Python - Liste des dictionnaires) réponse, le rendant un peu plus souple:
L'Appel De La Fonction:
Un quick-and-dirty solution est simplement de générer une nouvelle liste.
En python 3.6+ (ce que j'ai testé), il suffit d'utiliser:
Explication: nous sommes cartographie de la
json.dumps
pour coder les dictionnaires comme des objets json, qui sont immuables.set
peut ensuite être utilisé pour produire un objet iterable unique immutables. Enfin, nous convertir en arrière de notre dictionnaire de la représentation à l'aide dejson.loads
. Notez qu'au départ, on doit trier par touches pour organiser les dictionnaires dans une forme unique. Ceci est valable pour Python 3.6+ depuis les dictionnaires sont commandés par défaut.list
avant de faireset
.L'on peut faire avec
pandas
Avis légèrement différent de l'accepter réponse.
drop_duplicates
va vérifier toutes les colonnes dans les pandas , si tous les mêmes alors la ligne sera supprimée .Par exemple :
Si l'on change le 2ème
dict
nom de jean à peterAssez simple option:
Je ne sais pas si vous voulez seulement l'id de votre dicts dans la liste pour être unique, mais si l'objectif est de disposer d'un ensemble de dict où l'unicité est sur toutes les touches' valeurs.. vous devriez utiliser les tuples de la clé dans votre compréhension :
Espère que cela vous aide à vous ou une autre personne ayant le souci....
Il y a beaucoup de réponses ici, alors laissez-moi ajouter une autre:
Heres une mise en œuvre avec peu de surcharge de la mémoire au détriment de ne pas être aussi compact que le reste.
de sortie:
index
àlen(values)
et compter à rebours, ce qui signifie que vous pouvez toujours décrémenterindex
si vousdel
ou pas. par exemplefor index in reversed(range(len(values))):
C'est la solution que j'ai trouvé:
Fondamentalement, vous vérifiez si l'ID est présent dans la liste, si c'est le cas, supprimez le dictionnaire, si non, ajouter l'ID de la liste
each
jamais les références de l'article suivant est retiré