Comment dédupliquer une liste en Python

Aliaksei Yursha 30 janvier 2023
  1. Dédupliquer une liste Python sans préserver l’ordre
  2. Déduplication d’une liste Python avec préservation de l’ordre
Comment dédupliquer une liste en Python

Parfois en Python, nous avons une liste de valeurs, dont certaines sont des doublons.
C’est un cas d’utilisation courant pour supprimer tous les doublons de la liste, de sorte que
toutes les autres valeurs de la liste sont uniques.

Nous pouvons y parvenir en utilisant différentes méthodes, dont certaines préservent le l’ordre original des éléments, alors que d’autres ne le font pas.

Dédupliquer une liste Python sans préserver l’ordre

Si ce n’est pas une exigence pour préserver l’ordre original,
nous pouvons dédupliquer une liste en utilisant la structure de données intégrée set.
set est une structure de données qui ne peut contenir que des éléments uniques par conception.

En construisant un tel set à partir de notre liste initiale, tous les éléments dupliqués
sont ignorés.
Ensuite, nous pouvons convertir l’ensemble en une liste et nous obtiendrons une liste d’éléments uniques.

Malheureusement, l’ordre des éléments change, puisque la déduplication
de la structure de données set est implémentée en utilisant des tables de hachage, qui
ne pas se souvenir des éléments qui ont été insérés en premier.

>>> names = ['Bob', 'Stacy', 'Sarah', 'Jim', 'Stacy', 'Jim']
>>> unique_set = set(names)
>>> unique_list = list(unique_set)
>>> unique_list
['Stacy', 'Sarah', 'Jim', 'Bob']

Si vous utilisez le paquet NumPy pour le calcul scientifique en Python,
vous pouvez aussi utiliser la fonction numpy.unique().

>>> import numpy
>>> names = ['Bob', 'Stacy', 'Sarah', 'Jim', 'Stacy', 'Jim'] 
>>> numpy.unique(names).tolist()
['Bob', 'Jim', 'Sarah', 'Stacy']

Notez que la méthode ci-dessus ne préserve pas non plus l’ordre original des éléments.
La méthode NumPy qui préserve l’ordre est plus impliquée, et vous pouvez la trouver ci-dessous.

Déduplication d’une liste Python avec préservation de l’ordre

Une solution simple, qui permet de préserver l’ordre initial, est d’utiliser une double boucle pour chaque boucle.

La première boucle traverse tous les éléments de la liste initiale.
La seconde boucle vérifie si nous avons déjà vu un élément avec la même valeur.

Si ce n’est pas le cas, nous l’ajoutons à la liste unique, qui, à la fin,
contiendra des éléments uniques dans l’ordre original.

>>> names = ['Bob', 'Stacy', 'Sarah', 'Jim', 'Stacy', 'Jim']
>>> unique = []
>>> for name in names:         # 1st loop
...   if name not in unique:   # 2nd loop
...     unique.append(name)
...
>>> unique
['Bob', 'Stacy', 'Sarah', 'Jim']

Une autre façon de dédupliquer une liste tout en préservant l’ordre original est d’utiliser
la structure de données collections.OrderedDict.
OrderedDict est un type spécial de structure de données de dictionnaire en Python, qui
se souvient de l’ordre d’insertion de la clé.

>>> from collections import OrderedDict
>>> names = ['Bob', 'Stacy', 'Sarah', 'Jim', 'Stacy', 'Jim']
>>> unique = list(OrderedDict.fromkeys(names))
>>> unique
['Bob', 'Stacy', 'Sarah', 'Jim']

Si vous utilisez la bibliothèque d’analyse de données Python Pandas,
pandas.unique peut aussi être utile. Cette méthode permet de préserver l’ordre.

>>> import pandas
>>> names = ['Bob', 'Stacy', 'Sarah', 'Jim', 'Stacy', 'Jim']
>>> pandas.unique(names).tolist()
['Bob', 'Stacy', 'Sarah', 'Jim']

La méthode de NumPy pour dédupliquer une liste tout en préservant l’ordre est un peu plus compliquée.
Vous devez vous souvenir d’un index de chaque élément distinct et ensuite recréer une liste unique
de l’original en utilisant de tels indices.

>>> import numpy
>>> names = ['Bob', 'Stacy', 'Sarah', 'Jim', 'Stacy', 'Jim']
>>> _, indexes = numpy.unique(names, return_index=True)
>>> unique = [names[i] for i in numpy.sort(indexes)]
>>> unique
['Bob', 'Stacy', 'Sarah', 'Jim']

Article connexe - Python List