Ziemlich viel ich brauche, um ein Programm zu schreiben, um zu überprüfen, ob eine Liste hat keine Duplikate und wenn es tut es entfernt sie und gibt eine neue Liste mit den Elementen, die waren & #39; t dupliziert/entfernt. Dies ist, was ich habe, aber um ehrlich zu sein, ich weiß nicht, was zu tun ist.
def remove_duplicates():
t = ['a', 'b', 'c', 'd']
t2 = ['a', 'c', 'd']
for t in t2:
t.append(t.remove())
return t
Der übliche Ansatz, um eine eindeutige Sammlung von Objekten zu erhalten, ist die Verwendung eines Sets
. Sets sind ungeordnete Sammlungen von unterschiedlichen Objekten. Um eine Menge aus einer beliebigen Iterablen zu erstellen, können Sie sie einfach an die eingebaute Funktion set()
übergeben. Wenn Sie später wieder eine echte Liste benötigen, können Sie die Menge auf ähnliche Weise an die Funktion list()
übergeben.
Das folgende Beispiel sollte alles abdecken, was Sie zu tun versuchen:
>>> t = [1, 2, 3, 1, 2, 5, 6, 7, 8]
>>> t
[1, 2, 3, 1, 2, 5, 6, 7, 8]
>>> list(set(t))
[1, 2, 3, 5, 6, 7, 8]
>>> s = [1, 2, 3]
>>> list(set(t) - set(s))
[8, 5, 6, 7]
Wie Sie aus dem Ergebnis des Beispiels ersehen können, wird die ursprüngliche Reihenfolge nicht beibehalten. Wie bereits erwähnt, sind Mengen selbst ungeordnete Sammlungen, so dass die Reihenfolge verloren geht. Bei der Rückkonvertierung einer Menge in eine Liste wird eine beliebige Reihenfolge erstellt.
Wenn Ihnen die Ordnung wichtig ist, müssen Sie einen anderen Mechanismus verwenden. Eine sehr gebräuchliche Lösung dafür ist, sich auf OrderedDict
zu verlassen, um die Reihenfolge der Schlüssel beim Einfügen beizubehalten:
>>> from collections import OrderedDict
>>> list(OrderedDict.fromkeys(t))
[1, 2, 3, 5, 6, 7, 8]
Ab Python 3.7 ist das eingebaute Wörterbuch garantiert in der Lage, die Einfügereihenfolge beizubehalten, so dass Sie es auch direkt verwenden können, wenn Sie Python 3.7 oder später (oder CPython 3.6) verwenden:
>>> list(dict.fromkeys(t))
[1, 2, 3, 5, 6, 7, 8]
Beachten Sie, dass dies den Aufwand mit sich bringt, zuerst ein Wörterbuch und dann eine Liste daraus zu erstellen. Wenn Sie die Reihenfolge nicht unbedingt beibehalten müssen, sind Sie besser dran, wenn Sie ein Set verwenden. Lesen Sie [diese Frage] (https://stackoverflow.com/q/480214/216074) für weitere Details und alternative Möglichkeiten, die Reihenfolge beim Entfernen von Duplikaten beizubehalten.
Beachten Sie schließlich, dass sowohl die set
- als auch die OrderedDict
/dict
-Lösungen erfordern, dass Ihre Elemente hashable sind. Das bedeutet normalerweise, dass sie unveränderlich sein müssen. Wenn Sie mit Elementen umgehen muessen, die nicht hashbar sind (z.B. Listenobjekte), dann muessen Sie einen langsamen Ansatz verwenden, bei dem Sie im Grunde jedes Element mit jedem anderen Element in einer verschachtelten Schleife vergleichen muessen.
Es ist ein Einzeiler: list(set(source_list))
wird den Trick erledigen.
Eine "Menge" ist etwas, das unmöglich Duplikate haben kann.
Update: ein ordnungserhaltender Ansatz besteht aus zwei Zeilen:
from collections import OrderedDict
OrderedDict((x, True) for x in source_list).keys()
Hier nutzen wir die Tatsache, dass sich OrderedDict
die Einfügereihenfolge der Schlüssel merkt und sie nicht ändert, wenn ein Wert an einem bestimmten Schlüssel aktualisiert wird. Wir fügen True
als Werte ein, aber wir könnten alles einfügen, die Werte werden nur nicht verwendet. (Auch set
funktioniert ähnlich wie ein dict
mit ignorierten Werten.)
Wenn Sie sich nicht um die Reihenfolge kümmern, tun Sie einfach dies:
def remove_duplicates(l):
return list(set(l))
Ein "Set" hat garantiert keine Duplikate.