Comment supprimer des doublons de la liste Python et maintenir l'ordre? [dupliquer]

cette question a déjà une réponse ici:

  • Comment supprimer les doublons d'une liste tout en préservant l'ordre? 28 réponses

avec une liste de chaînes, Je veux les Trier par ordre alphabétique et supprimer les doublons. Je sais que je peux le faire:

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

mais je ne sais pas comment récupérer les membres de la liste à partir du hachage dans l'ordre alphabétique.

Je ne suis pas marié au hash, donc n'importe quel moyen d'accomplir cela fonctionnera. En outre, la performance n'est pas un problème, donc je préférerais une solution qui s'exprime clairement en code à une solution rapide mais plus opaque.

71
demandé sur Colonel Panic 2009-01-26 17:09:15

6 réponses

une liste peut être triée et dupliquée en utilisant des fonctions intégrées:

myList = sorted(set(myList))
  • set est une fonction intégrée pour Python > = 2.3
  • sorted est une fonction intégrée pour Python > = 2.4
183
répondu Rod Daunoravicius 2012-09-26 14:22:36

si votre entrée est déjà triée, il peut y avoir un moyen plus simple de le faire:

from operator import itemgetter
from itertools import groupby
unique_list = list(map(itemgetter(0), groupby(yourList)))
11
répondu sykora 2009-01-26 15:15:00

si vous voulez maintenir l'ordre de la liste originale, utilisez simplement OrderedDict avec None comme valeurs.

En Python2:

    from collections import OrderedDict
    from itertools import izip, repeat

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

en Python3 c'est encore plus simple:

    from collections import OrderedDict
    from itertools import repeat

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

si vous n'aimez pas les itérateurs (zip et repeat) vous pouvez utiliser un générateur (fonctionne à la fois en 2 et 3):

    from collections import OrderedDict
    unique_list = list(OrderedDict((element, None) for element in my_list))
4
répondu Paweł Sobkowiak 2016-09-10 22:30:33

si c'est la clarté que vous recherchez, plutôt que la vitesse, je pense que c'est très clair:

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

C'est O(n^2) cependant, avec l'utilisation répétée de ne pas, pour chaque élément de la liste d'entrée.

2
répondu unwind 2009-01-26 14:16:56

> mais je ne sais pas comment récupérer les membres de la liste dans l'ordre alphabétique.

ce N'est pas vraiment votre question principale, mais pour référence future la réponse de Rod en utilisant sorted peut être utilisé pour traverser un dict clés de l' ordre trié:

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

et aussi parce que tuple 's sont commandés par le premier membre du tuple, vous pouvez faire la même chose avec items :

for key, val in sorted(my_dict.items()):
    print key, val
    ...
1
répondu davidavr 2009-01-26 15:22:18

pour la chaîne de données

 output = []

     def uniq(input):
         if input not in output:
            output.append(input)
 print output     
0
répondu user2515605 2013-06-26 09:42:27