quadratische Laufzeit zu vermeiden, sollten Sie einen Anstich, um herauszufinden, welche Elemente erscheinen in mehr als einen Satz machen wollen:
import itertools
import collections
element_counts = collections.Counter(itertools.chain.from_iterable(allsets))
Dann können Sie einfach machen Sie eine Liste von Sätzen Halte alle Elemente, die erscheinen nur einmal:
nondupes = [{elem for elem in original if element_counts[elem] == 1}
for original in allsets]
Alternativ kann statt direkt nondupes
von element_counts
konstruieren, können wir einen zusätzlichen Pass machen konstruiere eine Menge aller Elemente, die genau in einer Eingabe erscheinen. Dies erfordert eine zusätzliche Erklärung, aber es erlaubt uns, die Vorteile der &
Operator für Schnittmenge zu nehmen die Liste Verständnis kürzer und effizienter zu machen:
element_counts = collections.Counter(itertools.chain.from_iterable(allsets))
all_uniques = {elem for elem, count in element_counts.items() if count == 1}
# ^viewitems() in Python 2.7
nondupes = [original & all_uniques for original in allsets]
Zeit zeigen scheint, dass eine all_uniques
Satz mit erzeugt eine erhebliche Beschleunigung für den gesamten Dublettenentfernungsprozess. Es ist bis zu einem 3.5x speedup auf Python 3 für stark-doppelte Eingabesätze, obwohl nur über eine 30% speedup für die gesamte Duplikat-Beseitigung Prozess auf Python 2 aufgrund mehr der Laufzeit wird von der Konstruktion des Counters dominiert. Diese Beschleunigung ist ziemlich beträchtlich, wenngleich nicht annähernd so wichtig wie das Vermeiden einer quadratischen Laufzeit unter Verwendung von element_counts
an erster Stelle. Wenn Sie Python 2 verwenden und dieser Code geschwindigkeitskritisch ist, sollten Sie statt Counter
einen gewöhnlichen dict
oder einen collections.defaultdict
verwenden.
Eine andere Möglichkeit wäre, einen dupes
Satz von element_counts
zu konstruieren und original - dupes
statt original & all_uniques
in der Liste Verständnis, wie suggested von Munk zu verwenden. Ob diese Leistung besser oder schlechter ist als die Verwendung eines all_uniques
Sets und &
, hängt vom Grad der Duplizierung in Ihrer Eingabe und von der Python-Version ab, in der Sie sich befinden, aber doesn'tseem macht einen großen Unterschied.
Verwandte: [Ersetzen Liste der Liste mit "verkürzter" Liste der Liste, während der Aufrechterhaltung der Ordnung] (http://stackoverflow.com/q/13714755/4279) – jfs