1
votes

Supprimer un élément déjà existant d'une liste et ne conserver qu'un seul élément de cette valeur dans la liste

J'ai une liste et s'il y a 2 éléments avec les mêmes valeurs je veux n'en garder qu'un

[1,2,3]

et je veux que le résultat soit:

l = [1,2,3,2,2]

comment puis-je faire cela?


2 commentaires

l = list (set (l)) Set est une structure qui n'autorise que des éléments uniques.


Si vous recherchez dans votre navigateur "Python remove list duplicates", vous trouverez des références qui peuvent expliquer cela bien mieux que ce que nous pouvons gérer ici.


3 Réponses :


0
votes

vous pouvez utiliser set () et list():

dict.fromkeys([1,2,3,2,2])
# Output: {1: None, 2: None, 3: None}
  • set () supprime tous les doublons, sans nécessairement préserver l'ordre.
  • list () convertit l'ensemble {1, 2, 3} en une liste

Comme les dictionnaires sont classés dans les versions ultérieures de Python, ceci:

list(dict.fromkeys([1,2,3,2,2]).keys())
# Output: [1, 2, 3]

conservera l'ordre sur Python 3.7+, contrairement à set () .

Remarque :

list(set([1,2,3,2,2]))
# Output: [1, 2, 3]
  • Nous générons un dictionnaire (sensible à l'ordre), en utilisant les éléments de la liste comme clés.

  • Les clés de dictionnaire, comme les ensembles, sont hachées et donc uniques - toutes les répétitions de la liste sont supprimées

  • Nous prenons ensuite les clés du nouveau dictionnaire et les reconvertissons en liste


2 commentaires

Notez que l'utilisation d'un set annule l'ordre des éléments de la liste d'origine.


@nosklo true, a proposé une autre solution pour Python 3.7+ via dict ()



0
votes

Si vous souhaitez conserver les éléments de la liste d'origine dans le même ordre, utilisez la recette unique_everseen de itertools documentation :

print(list(unique_everseen(l)))

Utilisation:

def unique_everseen(iterable, key=None):
    "List unique elements, preserving order. Remember all elements ever seen."
    # unique_everseen('AAAABBBCCDAABBB') --> A B C D
    # unique_everseen('ABBCcAD', str.lower) --> A B C D
    seen = set()
    seen_add = seen.add
    if key is None:
        for element in filterfalse(seen.__contains__, iterable):
            seen_add(element)
            yield element
    else:
        for element in iterable:
            k = key(element)
            if k not in seen:
                seen_add(k)


0 commentaires

1
votes

Si vous souhaitez conserver l'ordre des éléments, vous pouvez opter pour cette approche

list({s:None for s in l}.keys())

Si l'ordre n'est pas important, vous pouvez le faire en une seule ligne comme mentionné précédemment

XXX

Une autre solution en une ligne qui conservera l'ordre des éléments est (Notez que le dictionnaire conserve l'ordre des éléments en python 3.6+)

https://stackoverflow.com/a/39980744/8692977

list(set(l))


0 commentaires