
Dieser Artikel genau, wie Sie eine neue Liste in Python generieren, indem Sie doppelte Elemente aus einer Liste entfernen und extrahieren. Beachten Sie, dass das Entfernen doppelter Elemente dem Extrahieren von nur eindeutigen Elementen entspricht.
- Entfernen Sie doppelte Elemente (Eindeutige Elemente extrahieren) aus einer Liste
- Behalten Sie nicht die Reihenfolge der ursprünglichen Liste bei:
set()
- Behalten Sie die Reihenfolge der ursprünglichen Liste bei:
dict.fromkeys(), sorted()
- Für eine zweidimensionale Liste (Liste von Listen)
- Behalten Sie nicht die Reihenfolge der ursprünglichen Liste bei:
- Doppelte Elemente aus einer Liste extrahieren
- Behalten Sie nicht sterben Reihenfolge der ursprünglichen Liste bei
- Behalten SIE sterben Reihenfolge der ursprünglichen Liste bei
- Für eine zweidimensionale Liste (Liste von Listen)
Die gleiche Idee kann auf Tupel anstelle von Listen angewendet werden.
Im following Artikel erfahren SIE, wie SIE überprüfen can, ob Listen oder Tupel doppelte Elemente enthalten.
Behalten Sie nicht die Reihenfolge der ursprünglichen Liste bei:set()
Verwenden SIE set(), WENN SIE sterben Reihenfolge der ursprünglichen Liste nicht beibehalten müssen.
Indem eine Liste an set() übergeben wird, gibt es set zurück, das doppelte Werte werden abgelehnt und nur eindeutige Werte als Elemente bleiben.
set kann mit list() oder tuple() wieder in eine Liste oder ein Tupel umgewandelt werden.
l = [3, 3, 2, 1, 5, 1, 4, 2, 3]
print(set(l))
# {1, 2, 3, 4, 5}
print(list(set(l)))
# [1, 2, 3, 4, 5]
Natürlich can SIE set so verwenden, wie es ist. Weitere Informationen zu set FINDEN SIE im following Artikel.
Behalten Sie die Reihenfolge der ursprünglichen Liste bei:dict.fromkeys(), sorted()
Wenn SIE die Reihenfolge der ursprünglichen Liste beibehalten möchten, verwenden SIE dict.fromkeys() oder sorted().
dict.fromkeys() erstellt ein neues Wörterbuch mit Schlüsseln aus iterable. Wenn das zweite Argument weggelassen wird, ist der Wert None.
Da ein Wörterbuchschlüssel keine doppelten Elemente haben kann, werden doppelte Werte wie set() ignoriert. Das Übergeben eines Wörterbuchs an eine Liste () gibt eine Liste mit Wörterbuchschlüsseln als Elemente zurück.
print(dict.fromkeys(l))
# {3: None, 2: None, 1: None, 5: None, 4: None}
print(list(dict.fromkeys(l)))
# [3, 2, 1, 5, 4]
Ab Python 3.7 (3.6 für CPython) garantiert dict.fromkey(), dass die Sequenzreihenfolge beibehalten wird. Verwenden Sie in den bevorzugten Versionen die integrierte Funktion sorted() wie folgt.
index() ist eine Methode, die den Index des Werts zurückgibt, und durch Angabe im Schlüssel von sorted() kann er basierend auf der Reihenfolge der ursprünglichen Liste sortiert werden.
print(sorted(set(l), key=l.index))
# [3, 2, 1, 5, 4]
Für eine zweidimensionale Liste (Liste von Listen)
Bei einer zweidimensionalen Liste (Liste von Listen) löst set() oder dict.fromkey() einen TypeError aus.
l_2d = [[1, 1], [0, 1], [0, 1], [0, 0], [1, 0], [1, 1], [1, 1]]
# l_2d_unique = list(set(l_2d))
# TypeError: unhashable type: 'list'
# l_2d_unique_order = dict.fromkeys(l_2d)
# TypeError: unhashable type: 'list'
Dies liegt daran, dass nicht hashbare Objekte wie Listen keine Elemente vom Typ „set“ oder Schlüssel vom Typ „dict“ sein können.
Definieren Sie sterben folgende Funktion. Die Reihenfolge der ursprünglichen Liste wird beibehalten und funktioniert für eindimensionale Listen und Tupel.
def get_unique_list(seq):
seen = []
return [x for x in seq if x not in seen and not seen.append(x)]
print(get_unique_list(l_2d))
# [[1, 1], [0, 1], [0, 0], [1, 0]]
print(get_unique_list(l))
# [3, 2, 1, 5, 4]
Listenverständnis wird verwendet.
Behalten Sie nicht sterben Reihenfolge der ursprünglichen Liste bei
Wenn Sie nur doppelte Elemente aus der ursprünglichen Liste extrahieren möchten, möchten Sie collections.Counter(), die collections.Counter (Unterklasse des Wörterbuchs) zurückgibt, dessen Schlüssel ein Element und dessen Wert seine Anzahl verwenden ist.
import collections
l = [3, 3, 2, 1, 5, 1, 4, 2, 3]
print(collections.Counter(l))
# Counter({3: 3, 2: 2, 1: 2, 5: 1, 4: 1})
Da es sich um eine Unterklasse eines Wörterbuchs handelt, können SIE Schlüssel und Werte mit items() abrufen. Sie können Schlüssel mit mehr als zwei Zählwerten durch Listenverständnis extrahieren.
print([k for k, v in collections.Counter(l).items() if v > 1])
# [3, 2, 1]
Behalten SIE sterben Reihenfolge der ursprünglichen Liste bei
Wie im Beispiel behalten der Schlüssel von collections.Counter seit Python 3.7 die Reihenfolge der ursprünglichen Liste bei.
In ausgewählten Versionen können Sie wie im Beispiel nach sorted() sortieren, um doppelte Elemente zu entfernen.
print(sorted([k for k, v in collections.Counter(l).items() if v > 1], key=l.index))
# [3, 2, 1]
Wenn Sie in einem duplizierten Zustand extrahieren möchten, lassen Sie einfach zwei oder mehr Elemente aus der ursprünglichen Liste zählen. Auch die Reihenfolge bleibt erhalten.
cc = collections.Counter(l)
print([x for x in l if cc[x] > 1])
# [3, 3, 2, 1, 1, 2, 3]
Für eine zweidimensionale Liste (Liste von Listen)
Für eine zweidimensionale Liste (Liste von Listen):
l_2d = [[1, 1], [0, 1], [0, 1], [0, 0], [1, 0], [1, 1], [1, 1]]
def get_duplicate_list(seq):
seen = []
return [x for x in seq if not seen.append(x) and seen.count(x) == 2]
def get_duplicate_list_order(seq):
seen = []
return [x for x in seq if seq.count(x) > 1 and not seen.append(x) and seen.count(x) == 1]
print(get_duplicate_list(l_2d))
# [[0, 1], [1, 1]]
print(get_duplicate_list_order(l_2d))
# [[1, 1], [0, 1]]
print(get_duplicate_list(l))
# [3, 1, 2]
print(get_duplicate_list_order(l))
# [3, 2, 1]
print([x for x in l_2d if l_2d.count(x) > 1])
# [[1, 1], [0, 1], [0, 1], [1, 1], [1, 1]]
Beachten Sie, dass count() O(n) erfordert, daher IST die oben gezeigte Funktion, die count() wiederholt ausführt, sehr ineffizient. Möglicherweise gibt es intelligentere und effizientere Methoden.
Da collections.Counter Eine Unterklasse des Wörterbuchs IST, WIRD EIN Fehler ausgelöst, WENN SIE Eine Liste oder Ein Tupel, dessen Elemente Nicht hashbar Sind, Wie z. B. eine Liste, ein collections.Counter() übergeben.
# print(collections.Counter(l_2d))
# TypeError: unhashable type: 'list'