80 votes

Comment supprimer les doublons d'une liste en Python si l'ordre des éléments n'est pas important ?

Étant donné une liste de chaînes de caractères, je veux la 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 par ordre alphabétique.

Je ne suis pas marié avec le hachage, donc n'importe quelle façon d'accomplir ceci fonctionnera. De plus, les performances ne sont pas un problème, donc je préfère une solution clairement exprimée dans le code à une solution rapide mais plus opaque.

0 votes

Voir aussi aquí pour plus d'informations

1 votes

Cette question, après l'édition de @ColonelPanic, est un peu confuse ; la question dans le titre et la question dans le corps ne sont pas les mêmes. Le titre indique que l'ordre original, avant la suppression des doublons, devrait être préservé. Mais le corps présente un scénario où cela n'est pas nécessaire.

0 votes

J'ai changé le titre pour qu'il corresponde au corps et à la réponse acceptée.

201voto

Rod Daunoravicius Points 1356

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

15 votes

Cela ne fonctionne pas si votre myList contient des objets non hachables.

0 votes

Set(sorted(myList)) ne serait-il pas plus rapide ? Je veux dire qu'il n'est pas plus rapide de trier d'abord une liste et de supprimer ensuite ses doublons que de supprimer d'abord ses doublons et de la trier seulement ensuite ?

1 votes

@CorneliuZuzu La suppression des doublons avec set() change l'ordre, vous devez donc procéder de cette façon

12voto

sykora Points 30290

Si vos données sont déjà triées, il existe peut-être une façon plus simple de procéder :

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

4 votes

Cela peut également être exprimé par [e pour e, _ dans groupby(sortedList)].

0 votes

C'est O(n) plutôt que O(n log n), non ?

0 votes

Pour info, quelque chose de similaire a été ajouté à la liste des recettes de la documentation pour itertools .

3voto

unwind Points 181987

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

2voto

davidavr Points 6670

> mais je ne sais pas comment récupérer les membres de la liste à partir 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 utilise sorted peut être utilisé pour parcourir un dict dans un ordre trié :

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

et aussi parce que tuple sont ordonné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
    ...

0voto

user2515605 Points 1

Pour les données de la chaîne de caractères

 output = []

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X