web-dev-qa-db-fra.com

Comment supprimer les doublons de la liste Python et maintenir l'ordre?

Étant donné une liste de chaînes, je veux 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 la liste des membres du hachage par ordre alphabétique.

Je ne suis pas marié au hash, donc n'importe quel moyen d'y arriver fonctionnera. En outre, les performances ne sont pas un problème, je préférerais donc une solution exprimée clairement en code à une solution rapide mais plus opaque.

71
Josh Glover

Une liste peut être triée et dédupliquée à l'aide de 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
184
Rod Daunoravicius

Si votre entrée est déjà triée, il existe peut-être un moyen plus simple de le faire:

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

Si vous souhaitez conserver l'ordre de la liste d'origine, 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 répéter), 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
Paweł Sobkowiak

Si vous recherchez la clarté, plutôt que la rapidité, je pense que cela 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 not in pour chaque élément de la liste d'entrée.

2
unwind

> mais je ne sais pas comment extraire les membres de la liste du hachage par 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ée pour parcourir les clés de dict dans 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
davidavr

Pour les données de chaîne

 output = []

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