En mathématiques, il y a fixe y ensembles ordonnés (osets).
-
set : un conteneur non ordonné d'éléments uniques (implémenté)
-
oset : un conteneur ordonné d'éléments uniques (NotImplemented)
En Python, seuls les ensembles sont directement implémentés. Nous pouvons émuler les osets avec des clés de dictée régulières ( 3.7+ ).
Étant donné que
a = [1, 2, 20, 6, 210, 2, 1]
b = {2, 6}
Código
oset = dict.fromkeys(a).keys()
# dict_keys([1, 2, 20, 6, 210])
Démo
Les répliques sont supprimées, l'ordre d'insertion est préservé.
list(oset)
# [1, 2, 20, 6, 210]
Opérations de type "set" sur les touches de dictée.
oset - b
# {1, 20, 210}
oset | b
# {1, 2, 5, 6, 20, 210}
oset & b
# {2, 6}
oset ^ b
# {1, 5, 20, 210}
Détails
Remarque : un non ordonné n'exclut pas les éléments ordonnés. Au contraire, le maintien de l'ordre n'est pas garanti. Exemple :
assert {1, 2, 3} == {2, 3, 1} # sets (order is ignored)
assert [1, 2, 3] != [2, 3, 1] # lists (order is guaranteed)
On peut être heureux de découvrir qu'un liste y multiset (mset) sont deux autres structures de données mathématiques fascinantes :
-
liste : un conteneur ordonné d'éléments qui permet les répliques (implémenté)
-
mset : un conteneur non ordonné d'éléments qui permet les répliques (NotImplemented)*.
Résumé
Container | Ordered | Unique | Implemented
----------|---------|--------|------------
set | n | y | y
oset | y | y | n
list | y | n | y
mset | n | n | n*
*Un multiset peut être émulé indirectement avec collections.Counter()
une cartographie de type dictée de multiplicités (comptes).
149 votes
@KarlKnechtel - Oui "l'ordre est un concept sans signification pour les ensembles...en mathématiques" mais j'ai des problèmes du monde réel :)
1 votes
Sur CPython 3.6+
unique = list(dict.fromkeys([1, 2, 1]).keys())
. Cela fonctionne parce quedict
s préserver l'ordre d'insertion maintenant.