En mathématiques, il existe des ensembles et des 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 des osets avec des clés dict régulières ( 3.7+ ).
Donné
a = [1, 2, 20, 6, 210, 2, 1]
b = {2, 6}
Code
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 conservé.
list(oset)
# [1, 2, 20, 6, 210]
Opérations de type set sur les clés dict.
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: une structure non ordonnée n'empêche 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'une liste et un multiset (mset) sont deux structures de données mathématiques plus fascinantes:
- list : un conteneur ordonné d'éléments qui permet les répliques (implémenté)
- mset : un conteneur d'éléments non ordonnés 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 indirectement émulé avec collections.Counter()
, un mappage de type dict de multiplicités (comptes).