数据类型之集合
在python中集合分两种:
- set: 可变集合
- fronzenset: 不可变集合
集合的特点:
- 无序,非线性结构,不可以索引
- 不重复,常用于去重
- 可迭代
- 元素必须是可hash的,即不可变类型,包括嵌套数据结构中的元素
- 通过hash table实现,查询速度极快,可以高效地判断元素是否存在于某个集合
- 集合很消耗内存
线性结构的查询时间复杂度是O(n),即随着数据规模的增大而耗时增加。set和dict通过hash table实现,时间复杂度是O(1),查询时间与数据规模无关。
创建一个set。注意:创建一个空集合必须使用set()而不是{},{}用来创建一个空字典
s1 = set('abcde')
s2 = set(['a','b','c','d','e'])
s3 = {'a','b', 'c', 'd', 'e'}
print(s1)
print(s2)
print(s3)
# {'c', 'a', 'e', 'd', 'b'}
# {'c', 'a', 'e', 'd', 'b'}
# {'c', 'a', 'e', 'd', 'b'}
创建一个frozenset
s4 = frozenset('abcde')
print(s4)
# frozenset({'c', 'a', 'e', 'd', 'b'})
集合运算
s5 = set('cefxyz')
# 并集(合集),相加
print(s1 | s5)
# 这里可以传递一个或多个iterable,返回一个新的集合
print(s1.union(s5))
# 'z', 'd', 'f', 'c', 'x', 'a', 'e', 'b', 'y'}
# 并等
s1 |= s5
print(s1)
# {'c', 'd', 'e', 'z', 'b', 'f', 'a', 'y', 'x'}
# 这里也可以传递一个或者多个iterable,不同的是这里是就地修改
s1.update('opq')
print((s1))
# {'o', 'a', 'm', 'd', 'c', 'b', 'e', 'q', 'p'}
# 交集,公共部分
print(s1 & s5)
print(s1.intersection(s5))
# {'c', 'e'}
# 交等
s1 &= s5
print(s1)
print(s1.intersection_update('opq'))
# {'c', 'e'}
# 差集,相减
print(s1 - s5)
print(s1.difference(s5))
# {'b', 'a', 'd'}
# 差等
s1 -= s5
print(s1)
s1.difference_update(s5)
# {'b', 'a', 'd'}
# 对称差集,并集减去交集
print(s1 ^ s5)
print(s1.symmetric_difference(s5))
# {'x', 'a', 'b', 'z', 'y', 'd', 'f'}
# 对称差等
s1 ^= s5
print(s1)
s1.symmetric_difference_update(s5)
# {'x', 'a', 'b', 'z', 'y', 'd', 'f'}
对于两个集合A和B,如果A是B的子集,且A不等于B,那么A就是B的真子集,B是A的真超集。
判断一个集合是否是另一个集合的子集
s6 = {'a', 'b', 'c', 'd', 'e', 'f', 'g'}
print(s1.issubset(s6))
# True
print(s1 <= s6)
# True
# 判断真子集
print(s1 < s6)
# True
判断一个集合是否是另一个集合的超集(父集)
print(s6.issuperset(s1))
# True
print(s6 >= s1)
# True
# 判断真超集
print(s6 > s1)
# True
判断两个集合是否没有交集
print(s1.isdisjoint(s6))
# False
添加一个元素
s1.add('m')
print((s1))
# {'a', 'c', 'e', 'b', 'm', 'd'}
删除一个元素
# 对于remove()方法,如果元素不存在将抛出KeyError异常
s1.remove('a')
print((s1))
# {'p', 'e', 'c', 'd', 'm', 'o', 'q', 'b'}
# discard()方法同样用来删除一个元素,不过元素不存在时不做任何操作,并且不会抛出异常
s1.discard('b')
print(s1)
# {'q', 'd', 'o', 'e', 'p', 'c', 'm'}
# pop()删除任意一个元素并返回它的值,如果集合为空将抛出KeyError异常
res = s1.pop()
print(res)
# d
参考文档