Doppelte Einträge löschen

Ab Python 2.4 geht das ganz komfortabel mit set()

   1 >>> l = [1, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 5, 7, 8, 9]
   2 >>> list(set(l))
   3 [1, 2, 3, 5, 7, 8, 9]

Dass hierbei eine sortierte Liste rauskommt ist Zufall; da die Ordnung in einem Set unvorhersehbar ist, ist das nicht immer so. In einem solchen Fall nimmt man einfach statt list(set(l)) ein list(sorted(set(l))) ;)

Ansonsten kann man es auch über ein dict machen

   1 def uniq(seq):
   2     result = {}
   3     for item in seq:
   4         result[item] = None
   5     return result.keys()
   6 
   7 # Oder kürzer (ab 2.3):
   8 def uniq(seq):
   9     return dict.fromkeys(seq).keys()

Falls Reihenfolge auf den Daten implementiert ist, man aber keinen Hash bilden kann, kann man auch folgendes machen:

   1 def uniq(seq):
   2     result = list(seq)
   3     result.sort()
   4     i = 0
   5     for j in range(1,len(result)):
   6         if result[i] != result[j]:
   7             i += 1
   8             if i != j:
   9                 result[i] = result[j]
  10         j += 1
  11     del result[i+1:]
  12     return result

Das ganze ist durch das sortieren der Liste determiniert, welches Laufzeit O(n*log n) hat.

Oder die kompatibelste Lösung, die auch als einzige funktioniert wenn die Items nicht hashbar sind aber auf Gleichheit verglichen werden können (was ja die Mindestvorraussetzung für Duplikate ist) in allen Python-Versionen:

   1 def uniq(seq):
   2     result = []
   3     for item in seq:
   4         if not item in result:
   5             result.append(item)
   6     return result

Das ganze hat quadratische Laufzeit, und ist damit wirklich nur zu benutzen wenn der Typ nur die Gleichheitsprüfung zulässt und eben nicht hashbar ist, und vor allen Dingen sehr träge da die Laufzeit durch die Vergleiche (item in result) determiniert sind.

Doppelte Einträge löschen (last edited 2009-06-17 16:14:14 by localhost)