wake-up-neo.com

Wie entferne ich Duplikate aus der Python-Liste und halte die Reihenfolge ein?

Mit einer Liste von Zeichenfolgen möchte ich sie alphabetisch sortieren und Duplikate entfernen. Ich weiß ich kann das:

from sets import Set
[...]
myHash = Set(myList)

ich weiß jedoch nicht, wie ich die Listenmitglieder in alphabetischer Reihenfolge vom Hash abrufen kann.

Ich bin nicht mit dem Haschisch verheiratet, also wird dies alles funktionieren. Auch die Leistung ist kein Problem, daher würde ich eine Lösung bevorzugen, die sich klar im Code ausdrückt, aber eine undurchsichtige Lösung.

71
Josh Glover

Eine Liste kann mit integrierten Funktionen sortiert und dedupliziert werden:

myList = sorted(set(myList))
  • set ist eine integrierte Funktion für Python> = 2.3
  • sorted ist eine integrierte Funktion für Python> = 2.4
184

Wenn Ihre Eingabe bereits sortiert ist, gibt es möglicherweise einen einfacheren Weg:

from operator import itemgetter
from itertools import groupby
unique_list = list(map(itemgetter(0), groupby(yourList)))
10
sykora

Wenn Sie die Reihenfolge der ursprünglichen Liste beibehalten möchten, verwenden Sie einfach OrderedDict mit None als Werte.

In Python2:

    from collections import OrderedDict
    from itertools import izip, repeat

    unique_list = list(OrderedDict(izip(my_list, repeat(None))))

In Python3 ist es noch einfacher:

    from collections import OrderedDict
    from itertools import repeat

    unique_list = list(OrderedDict(Zip(my_list, repeat(None))))

Wenn Sie keine Iteratoren mögen (Zip und Repeat), können Sie einen Generator verwenden (funktioniert in 2 und 3):

    from collections import OrderedDict
    unique_list = list(OrderedDict((element, None) for element in my_list))
4

Wenn Sie mehr Wert auf Klarheit als auf Geschwindigkeit legen, ist dies meiner Meinung nach ganz klar:

def sortAndUniq(input):
  output = []
  for x in input:
    if x not in output:
      output.append(x)
  output.sort()
  return output

Es ist jedoch O (n ^ 2) mit der wiederholten Verwendung von nicht in für jedes Element der Eingabeliste.

2
unwind

> aber ich weiß nicht, wie ich die Listenmitglieder in alphabetischer Reihenfolge vom Hash abrufen kann.

Nicht wirklich Ihre Hauptfrage, aber für die zukünftige Referenz kann Rods Antwort mit sorted verwendet werden, um die Schlüssel einer dict in sortierter Reihenfolge zu durchlaufen:

for key in sorted(my_dict.keys()):
   print key, my_dict[key]
   ...

und weil Tuple von dem ersten Mitglied des Tuples geordnet wird, können Sie dasselbe mit items tun:

for key, val in sorted(my_dict.items()):
    print key, val
    ...
1
davidavr

Für die Zeichenfolgendaten

 output = []

     def uniq(input):
         if input not in output:
            output.append(input)
 print output     
0
user2515605