Existe-t-il un intégré qui supprime les doublons d'une liste en Python, tout en préservant l'ordre ? Je sais que je peux utiliser un ensemble pour supprimer les doublons, mais cela détruit l'ordre original. Je sais aussi que je peux créer mon propre programme comme ceci :
def uniq(input):
output = []
for x in input:
if x not in output:
output.append(x)
return output
(Merci à [unwind][1] pour cet [exemple de code][2]).
Mais j’aimerais profiter d’un idiome intégré ou plus pythonique si possible.
Question connexe : [En Python, quel est l'algorithme le plus rapide pour supprimer les doublons d'une liste afin que tous les éléments soient uniques tout en préservant l'ordre ?][3].
[1] : https://stackoverflow.com/users/28169/unwind [2] : https://stackoverflow.com/questions/479897/how-do-you-remove-duplicates-from-a-list-in-python#479921 [3] : https://stackoverflow.com/questions/89178/in-python-what-is-the-fastest-algorithm-for-removing-duplicates-from-a-list-so-t
Ici, vous avez quelques alternatives : http://www.peterbe.com/plog/uniqifiers-benchmark
La plus rapide :
def f7(seq):
seen = set()
seen_add = seen.add
return [x for x in seq if not (x in seen or seen_add(x))]
Pourquoi assigner seen.add
à seen_add
au lieu d'appeler simplement seen.add
? Python est un langage dynamique, et résoudre seen.add
à chaque itération est plus coûteux que de résoudre une variable locale. seen.add
pourrait avoir changé entre les itérations, et le runtime n'est pas assez intelligent pour l'exclure. Pour être sûr, il doit vérifier l'objet à chaque fois.
Si vous prévoyez d'utiliser beaucoup cette fonction sur le même ensemble de données, peut-être seriez-vous mieux avec un ensemble ordonné : http://code.activestate.com/recipes/528878/
O(1) insertion, suppression et vérification des membres par opération.
(Petite note supplémentaire : seen.add()
renvoie toujours None
, donc le *ou
' ci-dessus n'est là que comme moyen de tenter une mise à jour de l'ensemble, et non comme partie intégrante du test logique).
from itertools import groupby
[ key for key,_ in groupby(sortedList)]
La liste n'a même pas besoin d'être triée, la condition suffisante est que les valeurs égales soient regroupées.
Edit : J'ai supposé que "préserver l'ordre" implique que la liste est effectivement ordonnée. Si ce n'est pas le cas, alors la solution de MizardX est la bonne.
Community edit : C'est cependant la manière la plus élégante de "comprimer des éléments consécutifs en double en un seul élément".