Angenommen, ich habe eine Liste mit Wörterbüchern:
[
{'id': 1, 'name': 'john', 'age': 34},
{'id': 1, 'name': 'john', 'age': 34},
{'id': 2, 'name': 'hanna', 'age': 30},
]
und ich muss eine Liste eindeutiger Wörterbücher erhalten (Entfernen der Duplikate):
[
{'id': 1, 'name': 'john', 'age': 34},
{'id': 2, 'name': 'hanna', 'age': 30},
]
Kann mir jemand helfen, wie ich dies in Python am effizientesten erreichen kann?
python
dictionary
Limaaf
quelle
quelle
set(frozenset(i.items()) for i in list)
Antworten:
Machen Sie also ein vorübergehendes Diktat, wobei der Schlüssel der ist
id
. Dies filtert die Duplikate heraus. Dasvalues()
des Diktats wird die Liste seinIn Python2.7
In Python3
In Python2.5 / 2.6
quelle
{str(v['flight'])+':'+str(v['lon'])+','+str(v['lat']): v for v in stream}.values()
Dadurch wird nur ein eindeutiger Schlüssel erstellt, der auf Ihren Werten basiert. Like'MH370:-21.474370,86.325589'
{(v['flight'], v['lon'], v['lat']): v for v in stream}.values()
OrderedDict
auscollections
list(OrderedDict((v['id'], v) for v in L).values())
oder sortieren Sie die resultierende Liste, wenn das für Sie besser funktioniertlist({str(i):i for i in L}.values())
wir str (i), um eine eindeutige Zeichenfolge zu erstellen, die das Wörterbuch darstellt, das zum Filtern der Duplikate verwendet wird.Der übliche Weg, nur die gemeinsamen Elemente in einer Menge zu finden, ist die Verwendung der Python-
set
Klasse. Fügen Sie einfach alle Elemente zum Set hinzu, konvertieren Sie das Set in alist
und bam, die Duplikate sind verschwunden.Das Problem ist natürlich, dass a
set()
nur hashbare Einträge enthalten kann und adict
nicht hashbar ist.Wenn ich dieses Problem hätte, würde meine Lösung darin bestehen, jede
dict
in eine Zeichenfolge zu konvertieren , die die Zeichenfolge darstelltdict
, dann alle Zeichenfolgen zu a hinzuzufügen und dann die Zeichenfolgenwerte als aset()
auszulesenlist()
und zurück in zu konvertierendict
.Eine gute Darstellung einer
dict
Zeichenfolge ist das JSON-Format. Und Python hat ein eingebautes Modul für JSON (json
natürlich genannt).Das verbleibende Problem besteht darin, dass die Elemente in a
dict
nicht geordnet sind. Wenn Python diedict
in eine JSON-Zeichenfolge konvertiert , erhalten Sie möglicherweise zwei JSON-Zeichenfolgen, die äquivalente Wörterbücher darstellen, aber keine identischen Zeichenfolgen sind. Die einfache Lösung besteht darin, das Argumentsort_keys=True
beim Aufruf zu übergebenjson.dumps()
.EDIT: Diese Lösung ging davon aus, dass ein gegebener
dict
Teil einen anderen Teil haben könnte. Wenn wir davon ausgehen können, dass jederdict
mit demselben"id"
Wert mit jedemdict
mit demselben"id"
Wert übereinstimmt, ist dies ein Overkill. Die Lösung von @ gnibbler wäre schneller und einfacher.EDIT: Jetzt gibt es einen Kommentar von André Lima, der ausdrücklich sagt, dass wenn die ID ein Duplikat ist, man davon ausgehen kann, dass das Ganze
dict
ein Duplikat ist. Diese Antwort ist also übertrieben und ich empfehle die Antwort von @ gnibbler.quelle
Falls die Wörterbücher nur durch alle Elemente eindeutig identifiziert werden (ID ist nicht verfügbar), können Sie die Antwort mit JSON verwenden. Das Folgende ist eine Alternative, die JSON nicht verwendet und funktioniert, solange alle Wörterbuchwerte unveränderlich sind
quelle
Sie können die Numpy-Bibliothek verwenden (funktioniert nur für Python2.x):
Damit es mit Python 3.x (und neueren Versionen von numpy) funktioniert, müssen Sie ein Array von Dicts in ein numpy-Array von Zeichenfolgen konvertieren, z
quelle
TypeError: unorderable types: dict() > dict()
wenn Sie dies in Python 3.5 tun.Hier ist eine einigermaßen kompakte Lösung, obwohl ich vermute, dass sie nicht besonders effizient ist (um es milde auszudrücken):
quelle
map()
Aufruflist()
in Python 3, um eine Liste zurückzugewinnen, andernfalls handelt es sich um einmap
Objekt.Da das
id
zum Erkennen von Duplikaten ausreicht und dasid
Hash-fähig ist: Führen Sie sie durch ein Wörterbuch, dasid
den Schlüssel als Schlüssel hat. Der Wert für jeden Schlüssel ist das Originalwörterbuch.Gibt in Python 3
values()
keine Liste zurück. Sie müssen die gesamte rechte Seite dieses Ausdrucks einwickelnlist()
, und Sie können das Fleisch des Ausdrucks als Diktatverständnis wirtschaftlicher schreiben:Beachten Sie, dass das Ergebnis wahrscheinlich nicht in derselben Reihenfolge wie das Original angezeigt wird. Wenn dies erforderlich ist, können Sie a
Collections.OrderedDict
anstelle von a verwendendict
.Abgesehen davon kann es sehr sinnvoll sein , die Daten nur in einem Wörterbuch zu speichern, das das verwendet
id
Schlüssel as .quelle
Ausgänge:
quelle
Erweitern Sie die Antwort von John La Rooy ( Python - Liste der eindeutigen Wörterbücher ), um sie etwas flexibler zu gestalten:
Aufruffunktion:
quelle
Wir können damit machen
pandas
Beachten Sie etwas anders als die Antwort akzeptieren.
drop_duplicates
überprüft alle Spalten in Pandas, wenn alle gleich sind, wird die Zeile gelöscht.Zum Beispiel :
Wenn wir den 2.
dict
Namen von John in Peter ändernquelle
Verwenden Sie in Python 3.6+ (was ich getestet habe) einfach:
Erläuterung: Wir
json.dumps
ordnen die Wörterbücher als json-Objekte zu, die unveränderlich sind.set
kann dann verwendet werden, um eine Iterable von einzigartigen unveränderlichen zu erzeugen . Schließlich konvertieren wir mit in unsere Wörterbuchdarstellung zurückjson.loads
. Beachten Sie, dass zunächst nach Schlüsseln sortiert werden muss, um die Wörterbücher in einer eindeutigen Form anzuordnen. Dies gilt für Python 3.6+, da Wörterbücher standardmäßig sortiert sind.quelle
list
bevor Sie dies tunset
.Ich habe meine Favoriten zum Ausprobieren zusammengefasst:
https://repl.it/@SmaMa/Python-List-of-unique-dictionaries
quelle
Eine schnelle und schmutzige Lösung besteht darin, einfach eine neue Liste zu erstellen.
quelle
Ich weiß nicht, ob Sie nur möchten, dass die ID Ihrer Diktate in der Liste eindeutig ist, aber wenn das Ziel darin besteht, ein Diktat zu erstellen, bei dem die Einheitlichkeit auf allen Schlüsselwerten liegt. Sie sollten einen solchen Tupelschlüssel verwenden in Ihrem Verständnis:
Hoffe, es hilft Ihnen oder einer anderen Person, die das Problem hat ...
quelle
Hier gibt es viele Antworten, also lassen Sie mich noch eine hinzufügen:
quelle
Ziemlich einfache Option:
quelle
Nun, alle hier erwähnten Antworten sind gut, aber bei einigen Antworten kann es zu Fehlern kommen, wenn die Wörterbuchelemente eine verschachtelte Liste oder ein verschachteltes Wörterbuch haben. Daher schlage ich eine einfache Antwort vor
quelle
Hier ist eine Implementierung mit geringem Speicheraufwand, die nicht so kompakt ist wie die anderen.
Ausgabe:
quelle
index
at beginnenlen(values)
und rückwärts zählen möchten. Dies bedeutet, dass Sie immer dekrementieren können,index
ob Siedel
oder nicht. zBfor index in reversed(range(len(values))):
Dies ist die Lösung, die ich gefunden habe:
Grundsätzlich prüfen Sie, ob die ID in der Liste vorhanden ist. Wenn dies der Fall ist, löschen Sie das Wörterbuch. Wenn nicht, hängen Sie die ID an die Liste an
quelle