У математиці є множини і впорядковані множини (осети).
- набір : не упорядкований контейнер унікальних елементів (реалізовано)
- oset : замовлений контейнер унікальних елементів (NotImplemented)
У Python безпосередньо реалізуються лише набори. Ми можемо емулювати осети звичайними клавішами dict ( 3.7+ ).
Дано
a = [1, 2, 20, 6, 210, 2, 1]
b = {2, 6}
Код
oset = dict.fromkeys(a).keys()
# dict_keys([1, 2, 20, 6, 210])
Демо
Реплікації видаляються, порядок вставки зберігається.
list(oset)
# [1, 2, 20, 6, 210]
Набір операцій на клавішах dict.
oset - b
# {1, 20, 210}
oset | b
# {1, 2, 5, 6, 20, 210}
oset & b
# {2, 6}
oset ^ b
# {1, 5, 20, 210}
Деталі
Примітка: невпорядкована структура не виключає впорядковані елементи. Швидше, підтриманий порядок не гарантується. Приклад:
assert {1, 2, 3} == {2, 3, 1} # sets (order is ignored)
assert [1, 2, 3] != [2, 3, 1] # lists (order is guaranteed)
Можна із задоволенням виявити, що список та мультисети (mset) - це ще дві захоплюючі, математичні структури даних:
- list : упорядкований контейнер елементів, що дозволяє репліки (реалізовано)
- mset : не упорядкований контейнер елементів, що дозволяє копіювати (NotImplemented) *
Підсумок
Container | Ordered | Unique | Implemented
----------|---------|--------|------------
set | n | y | y
oset | y | y | n
list | y | n | y
mset | n | n | n*
* Мультисети можуть бути опосередковано емульовані collections.Counter()
, подібно подібним відображенням множин (лічильників).