在数学中,有集合和有序集合(osets)。
- set:唯一元素的无序容器(实现)
- oset:唯一元素的有序容器(未实现)
在Python中,仅直接实现集合。我们可以使用常规的dict键(3.7+)模拟osets 。
给定
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()
dict样的多重性(计数)映射间接模拟多重集。