В математике есть множества и упорядоченные множества (oset).
- set : неупорядоченный контейнер уникальных элементов (Реализовано)
- oset : упорядоченный контейнер уникальных элементов (NotImplemented)
В Python напрямую реализованы только наборы. Мы можем эмулировать oset с помощью обычных клавиш 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) - это еще две увлекательные математические структуры данных:
- список : упорядоченный контейнер элементов, который разрешает репликацию (реализовано)
- mset : неупорядоченный контейнер элементов, разрешающий репликацию (NotImplemented) *
Резюме
Container | Ordered | Unique | Implemented
----------|---------|--------|------------
set | n | y | y
oset | y | y | n
list | y | n | y
mset | n | n | n*
* Мультимножество может быть косвенно эмулировано с collections.Counter()
помощью dict-подобного отображения кратностей (счетчиков).