Frage 13 zum Python-Datenstrukturalgorithmus: Löschen Sie dieselben Elemente in der Sequenz und behalten Sie die Reihenfolge bei

Frage:

Wie kann man doppelte Werte in einer Sequenz entfernen und gleichzeitig die Reihenfolge der Elemente beibehalten?

Lösung:

Wenn die Werte in der Sequenz alle hashbare Typen sind, können Sie dieses Problem problemlos mit einer Sammlung oder einem Generator lösen.

def dedupe(items): seen = set()
for item in items:
if item not in seen:
yield item seen.add(item)

Hier ist ein Beispiel für die Verwendung der obigen Funktion:

>>> a = [1, 5, 2, 1, 9, 1, 5, 10] >>> list(dedupe(a))
[1, 5, 2, 9, 10]
>>>

Diese Methode funktioniert nur, wenn die Elemente in der Sequenz hashbar sind. Wenn Sie doppelte Elemente in einer Sequenz entfernen möchten, deren Elemente nicht hashbar sind (z. B. vom Typ dict), müssen Sie den obigen Code wie folgt leicht ändern:

def dedupe(items, key=None): seen = set()
for item in items:
val = item if key is None else key(item) if val not in seen:
yield item seen.add(val)

Der Schlüsselparameter gibt hier eine Funktion zum Konvertieren von Sequenzelementen in einen hashbaren Typ an.

>>> a = [ {
    
    'x':1, 'y':2}, {
    
    'x':1, 'y':3}, {
    
    'x':1, 'y':2}, {
    
    'x':2, 'y':4}] >>> list(dedupe(a, key=lambda d: (d['x'],d['y'])))
[{
    
    'x': 1, 'y': 2}, {
    
    'x': 1, 'y': 3}, {
    
    'x': 2, 'y': 4}]
>>> list(dedupe(a, key=lambda d: d['x']))
[{
    
    'x': 1, 'y': 2}, {
    
    'x': 2, 'y': 4}]
>>>

Wenn Sie doppelte Elemente basierend auf einem einzelnen Feld, Attribut oder einer größeren Datenstruktur entfernen möchten, funktioniert die zweite Option genauso gut.

Wenn Sie nur doppelte Elemente entfernen möchten, können Sie normalerweise einfach eine Menge erstellen.

>>> a
[1, 5, 2, 1, 9, 1, 5, 10] >>> set(a)
{
    
    1, 2, 10, 5, 9}
>>>

Diese Methode kann jedoch die Reihenfolge der Elemente nicht beibehalten und die Positionen der Elemente in den generierten Ergebnissen werden durcheinander gebracht. Die obige Methode kann diese Situation vermeiden.

In diesem Abschnitt verwenden wir Generatorfunktionen, um unsere Funktionen allgemeiner zu gestalten als nur die Listenverarbeitung. Wenn Sie beispielsweise eine Datei lesen und doppelte Zeilen entfernen möchten.

with open(somefile,'r') as f: for line in dedupe(f):
...

Die oben genannten Schlüsselfunktionsparameter ahmen die ähnlichen Funktionen integrierter Funktionen wie sorted(), min() und max() nach.

おすすめ

転載: blog.csdn.net/m0_68635815/article/details/135439605