数学には、セットと順序付きセット(オセット)があります。
- set:一意の要素の順序付けされていないコンテナ(実装)
- oset:順序付けされた一意の要素のコンテナ(NotImplemented)
Pythonでは、セットのみが直接実装されます。通常のdictキーでosetsをエミュレートできます(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*
* multisetはcollections.Counter()
、multiplicities(counts)のdictのようなマッピングで間接的にエミュレートできます。