Duplikate in Python entfernen: Ein umfassender Leitfaden
Fünf praktische Methoden zum Entfernen von Duplikaten aus einer Python-Liste: set(), dict.fromkeys(), for-Schleife, List Comprehension und Counter.
Doppelte Werte in einer Python-Liste kommen häufig vor, wenn Benutzereingaben gesammelt, Datensätze zusammengeführt oder Dateien gelesen werden. Dieser Leitfaden stellt fünf praktische Techniken zum Entfernen von Duplikaten vor — jede mit einem anderen Kompromiss zwischen Geschwindigkeit, Reihenfolgeerhaltung und Lesbarkeit.
| Methode | Erhält die Reihenfolge | Funktioniert mit nicht-hashbaren Elementen | Lesbar |
|---|---|---|---|
set() | Nein | Nein | Ja |
dict.fromkeys() | Ja (Python 3.7+) | Nein | Ja |
| for-Schleife mit Seen-Set | Ja | Nein | Mittel |
| List Comprehension | Ja | Nein | Mittel |
Counter (Duplikate finden) | Ja | Nein | Ja |
set() zum Entfernen von Duplikaten verwenden
Eine Liste in ein Set umzuwandeln ist die schnellste und knappste Methode zur Deduplizierung. Ein Set speichert nur eindeutige, hashbare Werte, sodass Duplikate automatisch verworfen werden.
Ausgabe (Reihenfolge kann variieren):
[1, 2, 3, 4, 5]Wann zu verwenden: Die Reihenfolge spielt keine Rolle und die Liste enthält nur hashbare Elemente (Zahlen, Strings, Tupel).
Achtung: Sets sind ungeordnet. Auch wenn kleine Integer-Sets häufig in sortierter Reihenfolge ausgegeben werden, ist darauf kein Verlass. Wenn die Reihenfolge wichtig ist, verwenden Sie eine der folgenden Methoden.
dict.fromkeys() zur Erhaltung der Reihenfolge verwenden
dict.fromkeys() erstellt ein Dictionary, dessen Schlüssel die Listenelemente sind. Da Dictionary-Schlüssel eindeutig sind und seit Python 3.7 in Einfügereihenfolge gespeichert werden, entfernt diese Methode Duplikate und behält gleichzeitig die ursprüngliche Reihenfolge bei.
Ausgabe:
[1, 2, 3, 4, 5]Dies ist der idiomatische Einzeiler für reihenfolgeerhaltende Deduplizierung in modernem Python (3.7+). Er ist auch etwas schneller als eine explizite Schleife, da die Dictionary-Operationen in C ausgeführt werden.
for-Schleife mit Seen-Set verwenden
Wenn volle Kontrolle benötigt wird — zum Beispiel um übersprungene Duplikate zu protokollieren oder benutzerdefinierte Gleichheitslogik anzuwenden — ist eine explizite Schleife der klarste Ansatz.
def remove_duplicates(lst):
seen = set()
result = []
for item in lst:
if item not in seen:
seen.add(item)
result.append(item)
return result
my_list = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5]
print(remove_duplicates(my_list))Ausgabe:
[3, 1, 4, 5, 9, 2, 6]Dies erhält die Einfügereihenfolge und läuft in O(n)-Zeit — die in-Prüfung auf einem Set ist O(1). Im Vergleich dazu ist if item not in result O(n) pro Element und macht die gesamte Funktion O(n²).
List Comprehension verwenden
Dasselbe Seen-Set-Muster lässt sich als Einzeiler mit einer List Comprehension schreiben. Der Trick besteht darin, dass set.add() immer None zurückgibt (falsy), sodass not (x in seen or seen.add(x)) nur beim ersten Auftreten jedes Wertes True ist.
my_list = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3]
seen = set()
unique = [x for x in my_list if not (x in seen or seen.add(x))]
print(unique)Ausgabe:
[3, 1, 4, 5, 9, 2, 6]Das ist kompakt, beruht aber auf einem Nebeneffekt innerhalb der Comprehension, was für Leser überraschend sein kann. Die explizite for-Schleife oben wird im Team-Code häufig bevorzugt.
Counter zum Auffinden doppelter Werte verwenden
Manchmal muss man wissen, welche Werte mehr als einmal vorkommen, anstatt sie einfach zu entfernen. collections.Counter zählt Vorkommen und macht dies einfach.
from collections import Counter
my_list = [1, 2, 2, 3, 4, 4, 5, 5, 5]
counts = Counter(my_list)
print(counts)
duplicates = [item for item, count in counts.items() if count > 1]
print("Duplicated values:", duplicates)Ausgabe:
Counter({5: 3, 2: 2, 4: 2, 1: 1, 3: 1})
Duplicated values: [2, 4, 5]Um eine deduplizierte Liste aus einem Counter zu erhalten, verwenden Sie list(counts.keys()) — Schlüssel behalten in Python 3.7+ die Einfügereihenfolge bei.
Duplikate aus einem DataFrame mit Pandas entfernen
Bei der Arbeit mit tabellarischen Daten bietet die Pandas-Bibliothek DataFrame.drop_duplicates(). Diese Methode unterstützt eine detaillierte Steuerung über ihre Parameter.
import pandas as pd
data = {
'name': ['Alice', 'Bob', 'Alice', 'Charlie', 'Bob'],
'score': [90, 85, 90, 78, 85],
}
df = pd.DataFrame(data)
df_unique = df.drop_duplicates()
print(df_unique)Ausgabe:
name score
0 Alice 90
1 Bob 85
3 Charlie 78Wichtige Parameter:
subset— ein Spaltenname oder eine Liste von Spaltennamen, die berücksichtigt werden sollen. Duplikate werden nur innerhalb dieser Spalten erkannt.keep—'first'(Standard) behält das erste Vorkommen;'last'behält das letzte;Falselöscht alle Zeilen, die Duplikate aufweisen.inplace=True— ändert den DataFrame direkt, anstatt einen neuen zurückzugeben.
# Keep only the last occurrence of each name
df_last = df.drop_duplicates(subset='name', keep='last')
print(df_last)Ausgabe:
name score
2 Alice 90
3 Charlie 78
4 Bob 85Die richtige Methode wählen
- Schnellste Methode, Reihenfolge unwichtig —
set(). - Reihenfolge wichtig, Einzeiler —
dict.fromkeys(). - Benutzerdefinierte Logik oder Protokollierung — explizite for-Schleife mit einem Seen-Set.
- Tabellarische Daten —
pandas.DataFrame.drop_duplicates(). - Ermitteln, welche Werte doppelt vorkommen —
collections.Counter.
Weitere Informationen zur Arbeit mit Listen finden Sie im Kapitel Python Lists und in der vollständigen Referenz der Listen-Methoden. Mehr über Sets und ihre Operationen erfahren Sie unter Python Sets und Set Methods.