在数学中,有集和有序集(oset)。
set:唯一元素的无序容器(已实现)
oset:唯一元素的有序容器
在Python中,只有集合是直接实现的。我们可以用常规字典键(3.7+)来模拟偏移量。
鉴于
a = [1, 2, 20, 6, 210, 2, 1]
b = {2, 6}
Code
oset = dict.fromkeys(a).keys()
# dict_keys([1, 2, 20, 6, 210])
Demo
删除复制,保留插入顺序。
list(oset)
# [1, 2, 20, 6, 210]
字典键上类似set的操作。
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()间接模拟,这是一个类似字典的多重度(计数)映射。