Python >> Tutoriel Python >  >> Python

Comment supprimer les doublons d'une liste Python tout en préservant l'ordre ?

Pour supprimer les doublons d'une liste Python tout en préservant l'ordre des éléments, utilisez le code list(dict.fromkeys(list)) qui passe par deux phases :(1) Convertir la liste en dict en utilisant le dict.fromkeys() fonction avec les éléments de la liste comme clés et None comme valeurs de dict. (2) Reconvertir le dictionnaire en liste en utilisant le list() constructeur. Comme les dictionnaires préservent l'ordre des clés, l'ordre de la liste est préservé.

Problème :Comment supprimer les doublons d'une liste Python tout en conservant l'ordre des éléments de la liste ?

Vous trouverez peut-être cette question un peu gênante. Qu'est-ce que la suppression des doublons a à voir avec la préservation de l'ordre des éléments ? La raison est simple :un moyen bien connu et efficace de supprimer les doublons d'une liste consiste à convertir la liste en un ensemble - qui est sans duplication - et à la reconvertir en liste. Voici ce que vous pouvez trouver partout :

lst = [42, 42, 'Alice', 'Alice', 1]
dup_free = list(set(lst))
print(dup_free)
# ['Alice', 42, 1]

La conversion aller-retour list(set(lst)) supprime tous les doublons de la liste. Cependant, il ne préserve pas l'ordre des éléments. Dans l'exemple, la chaîne 'Alice' apparaît désormais devant l'entier 42 .

Alors, comment supprimer les doublons tout en préservant l'ordre des éléments ?

L'approche la plus Pythonique et la plus rapide consiste à utiliser un dictionnaire :

lst = [3, 3, 22, 22, 1]
result = list(dict.fromkeys(lst))
print(result)
# [3, 22, 1]

Le dict.fromkeys() La méthode crée un nouveau dictionnaire en utilisant les éléments d'un itérable comme clés. Les clés de dictionnaire Python sont uniques par défaut, donc la conversion de notre liste en dictionnaire supprimera automatiquement les doublons. Une fois que cela a été fait avec notre liste initiale, la conversion du dictionnaire aboutit à la liste sans doublons.

C'est le moyen le plus Pythonique de supprimer les doublons d'une liste Python tout en préservant l'ordre.

Cette méthode est-elle rapide ? Comme les ensembles, les dictionnaires utilisent des tables de hachage, ce qui signifie qu'ils sont extrêmement rapides.

Voulez-vous développer les compétences d'un professionnel Python complet —tout en étant payé dans le processus ? Devenez freelance Python et commandez votre livre Leaving the Rat Race with Python sur Amazon (Kindle/Print ) !

Les dictionnaires Python préservent-ils l'ordre des clés ?

Étonnamment, les clés du dictionnaire en Python préservent l'ordre des éléments . Donc, oui, l'ordre des éléments est préservé. (source)

D'innombrables ressources en ligne comme celle-ci soutiennent que l'ordre des clés du dictionnaire n'est pas préservé. Ils supposent que l'implémentation sous-jacente des itérables de clé du dictionnaire utilise des ensembles - et les ensembles sont bien connus pour être agnostiques à l'ordre des éléments. Mais cette hypothèse est fausse. L'implémentation du dictionnaire Python intégré dans cPython préserve l'ordre.

Voici un autre exemple :

lst = ['Alice', 'Bob', 'Bob', 1, 1, 1, 2, 3, 3]
dic = dict.fromkeys(lst)
print(dic)
# {'Alice': None, 'Bob': None, 1: None, 2: None, 3: None}

Vous voyez que l'ordre des éléments est conservé, donc lors de la reconversion, l'ordre d'origine des éléments de la liste est toujours conservé :

print(list(dic))
# ['Alice', 'Bob', 1, 2, 3]

Cependant, vous ne pouvez pas vous y fier car toute implémentation Python pourrait, théoriquement, décider de ne pas conserver l'ordre (notez que le "pourrait" ici est 100 % théorique et ne s'applique pas à l'implémentation cPython par défaut).

Si vous avez besoin d'être certain que l'ordre est préservé, vous pouvez utiliser la bibliothèque de dictionnaires ordonnés. Dans cPython, il s'agit simplement d'un wrapper pour l'implémentation de dict par défaut.

Article source : Comment supprimer les doublons d'une liste Python ?

Suppression des doublons des listes ordonnées pour les anciennes versions

Les dictionnaires n'ont été ordonnés dans toutes les implémentations Python que lorsque Python 3.7 a été publié (il s'agissait également d'un détail d'implémentation de CPython 3.6).

Donc, si vous utilisez une ancienne version de Python, vous devrez importer le OrderedDict classe du package de collections dans la bibliothèque standard à la place :

 from collections import OrderedDict
 lst = [1, 1, 9, 1, 9, 6, 9, 7]
 result = list(OrderedDict.fromkeys(lst))

La sortie est la liste sans doublons suivante avec l'ordre des éléments conservé :

 print(result)
 # [1, 9, 6, 7]

Interface de code interactif

Essayons cette méthode dans notre shell Python interactif :

Exercice : Exécutez le code. Est-ce que ça marche ?

Vous pouvez trouver d'autres moyens de supprimer les doublons tout en préservant l'ordre dans cet article de blog détaillé :

Tutoriel associé : Liste Python :supprimez les doublons et conservez la commande