W matematyce istnieją zbiory i zbiory uporządkowane (osety).
- zestaw : nieuporządkowany pojemnik z unikalnymi elementami (zaimplementowany)
- oset : uporządkowany kontener unikalnych elementów (NotImplemented)
W Pythonie tylko zestawy są implementowane bezpośrednio. Możemy emulować osety zwykłymi klawiszami dyktowania ( 3.7+ ).
Dany
a = [1, 2, 20, 6, 210, 2, 1]
b = {2, 6}
Kod
oset = dict.fromkeys(a).keys()
# dict_keys([1, 2, 20, 6, 210])
Próbny
Repliki są usuwane, kolejność wstawiania zostaje zachowana.
list(oset)
# [1, 2, 20, 6, 210]
Operacje podobne do zestawów na klawiszach dyktowania.
oset - b
# {1, 20, 210}
oset | b
# {1, 2, 5, 6, 20, 210}
oset & b
# {2, 6}
oset ^ b
# {1, 5, 20, 210}
Detale
Uwaga: nieuporządkowana konstrukcja nie wyklucza zamówionych elementów. Raczej nie gwarantuje się zachowania porządku. Przykład:
assert {1, 2, 3} == {2, 3, 1} # sets (order is ignored)
assert [1, 2, 3] != [2, 3, 1] # lists (order is guaranteed)
Z przyjemnością odkryjesz, że lista i zestaw wielozbiorowy (mset) to dwie bardziej fascynujące, matematyczne struktury danych:
- lista : uporządkowany kontener elementów, który umożliwia replikacje (wdrożony)
- mset : nieuporządkowany kontener elementów, który pozwala na replikacje (NotImplemented) *
Podsumowanie
Container | Ordered | Unique | Implemented
----------|---------|--------|------------
set | n | y | y
oset | y | y | n
list | y | n | y
mset | n | n | n*
* Multiset może być pośrednio emulowany za collections.Counter()
pomocą dyktowanego odwzorowania wielokrotności (zliczeń).