Wie man eine Liste in Python dedupliziert

Aliaksei Yursha 25 Juni 2020
  1. Python-Liste ohne Wahrung der Ordnung entpacken
  2. Deduplizieren einer Python-Liste unter Beibehaltung der Reihenfolge
Wie man eine Liste in Python dedupliziert

Manchmal haben wir in Python eine Liste von Werten, unter denen einige Duplikate sind.
Es ist ein alltäglicher Anwendungsfall, alle Duplikate aus der Liste zu entfernen, so dass
alle übrigen Werte in der Liste sind eindeutig.

Dies können wir mit verschiedenen Methoden erreichen, von denen einige die
ursprüngliche Reihenfolge der Elemente, während andere nicht.

Python-Liste ohne Wahrung der Ordnung entpacken

Wenn es keine Voraussetzung ist, die ursprüngliche Ordnung zu erhalten,
können wir eine Liste unter Verwendung der eingebauten Set Datenstruktur deduplizieren.
set ist eine Datenstruktur, die nur ein einziges Element enthalten darf.

Indem wir eine solche set aus unserer ursprünglichen Liste konstruieren, können alle doppelten Elemente
werden ignoriert.
Dann können wir die Menge wieder in eine Liste zurück konvertieren und erhalten eine Liste von eindeutigen Elementen.

Leider ändert sich die Reihenfolge der Elemente, da das Deduplizieren
Die Funktionalität der Set Datenstruktur wird durch Hash-Tabellen implementiert, die
Ich weiß nicht mehr, welche Elemente zuerst eingefügt wurden.

>>> names = ['Bob', 'Stacy', 'Sarah', 'Jim', 'Stacy', 'Jim']
>>> unique_set = set(names)
>>> unique_list = list(unique_set)
>>> unique_list
['Stacy', 'Sarah', 'Jim', 'Bob']

Wenn Sie das Paket NumPy für wissenschaftliches Rechnen in Python verwenden, können Sie sich nicht erinnern, welche Elemente zuerst eingefügt wurden,
können Sie auch die numpy.unique() Funktion verwenden.

>>> import numpy
>>> names = ['Bob', 'Stacy', 'Sarah', 'Jim', 'Stacy', 'Jim'] 
>>> numpy.unique(names).tolist()
['Bob', 'Jim', 'Sarah', 'Stacy']

Beachten Sie, dass die obige Methode auch nicht die ursprüngliche Reihenfolge der Elemente beibehält.
Der ordnungserhaltende NumPy Weg ist mehr involviert, und Sie können ihn unten finden.

Deduplizieren einer Python-Liste unter Beibehaltung der Reihenfolge

Eine einfache Lösung, die es erlaubt, die ursprüngliche Reihenfolge zu erhalten, ist die Verwendung einer doppelten for-each-Schleife.

Die erste Schleife durchläuft alle Elemente der ursprünglichen Liste.
Die zweite Schleife prüft, ob wir bereits ein Element mit dem gleichen Wert gesehen haben.

Wenn wir es nicht gesehen haben, fügen wir es der unique Liste hinzu, die am Ende
wird einzigartige Elemente in der ursprünglichen Reihenfolge enthalten.

>>> names = ['Bob', 'Stacy', 'Sarah', 'Jim', 'Stacy', 'Jim']
>>> unique = []
>>> for name in names:         # 1st loop
...   if name not in unique:   # 2nd loop
...     unique.append(name)
...
>>> unique
['Bob', 'Stacy', 'Sarah', 'Jim']

Eine weitere Möglichkeit, eine Liste unter Beibehaltung der ursprünglichen Reihenfolge zu deduplizieren, ist die Verwendung von
die Collections.OrderedDict Datenstruktur.
OrderedDict ist eine spezielle Art einer Dictionary-Datenstruktur in Python, die
merkt sich die Reihenfolge der Schlüsseleinführung.

>>> from collections import OrderedDict
>>> names = ['Bob', 'Stacy', 'Sarah', 'Jim', 'Stacy', 'Jim']
>>> unique = list(OrderedDict.fromkeys(names))
>>> unique
['Bob', 'Stacy', 'Sarah', 'Jim']

Wenn Sie die Pandas Python-Datenanalyse-Bibliothek verwenden, können Sie sich die Reihenfolge der Schlüsseleinfügung merken,
pandas.unique könnte ebenfalls hilfreich sein. Diese Methode ist ordnungserhaltend.

>>> import pandas
>>> names = ['Bob', 'Stacy', 'Sarah', 'Jim', 'Stacy', 'Jim']
>>> pandas.unique(names).tolist()
['Bob', 'Stacy', 'Sarah', 'Jim']

Der Weg eines NumPy, eine Liste zu deduplizieren und dabei die Reihenfolge beizubehalten, ist etwas komplizierter.
Sie müssen sich einen Index jedes einzelnen Elements merken und dann eine eindeutige Liste erstellen.
von der ursprünglichen, die solche Indizes verwendet.

>>> import numpy
>>> names = ['Bob', 'Stacy', 'Sarah', 'Jim', 'Stacy', 'Jim']
>>> _, indexes = numpy.unique(names, return_index=True)
>>> unique = [names[i] for i in numpy.sort(indexes)]
>>> unique
['Bob', 'Stacy', 'Sarah', 'Jim']

Verwandter Artikel - Python List