集合
- 类似字典的 key 的集合(java 的 HashSet 也是 由 HashMap 来实现的)
- 没有顺序,所以不能使用下标来操作元素(获取也不行)
- 每一项不可变,要是放入可变元素会报错
声明集合
s = set() # 创建空 set 只能这种方式,因为 {} 表示空字典
s = {"name", 123, (1,2)}
s = {"name", 123, [1,2]} # 报错,因为每个 key 都要是不可变的
常见方法
# 添加元素
s = {1, 2}
s.add(3)
print(s) # 输出 {1, 2, 3}
# 移除元素(不存在会报错)
s.remove(2)
print(s) # 输出 {1, 3}
# 移除元素(存在才移除,不存在什么都不做)
s.discard(3)
print(s) # 输出 {1}
# 删除并返回集合中的任意一个元素,如果集合为空则抛出 KeyError
s = {1, 2}
popped = s.pop()
print(popped) # 输出 1
print(s) # 输出 {2}
# 清空集合中的所有元素
s.clear()
print(s) # 输出 set(),表示空 set
# 判断元素是否存在
s = {1, 2}
print(1 in s) # 输出 True
print(3 in s) # 输出 False
# 返回当前集合与其他集合的并集
s1 = {1, 2}
s2 = {2, 3}
print(s1.union(s2)) # 输出 {1, 2, 3}
# 返回当前集合与其他集合的交集
print(s1.intersection(s2)) # 输出 {2}
# 返回当前集合与其他集合的差集(抛开交集后 s1 相比约 s2 多出来的元素)
print(s1.difference(s2)) # 输出 {1}
# 两个集合交集之外的所有元素(专业术语叫 对称差集)
print(s1.symmetric_difference(s2)) # 输出 {1, 3}
# 检查当前集合是否是另一个集合的子集
print(s1.issubset({1, 2, 3})) # 输出 True
# 检查当前集合是否是另一个集合的超集
print({1, 2, 3}.issuperset(s1)) # 输出 True
# 检查当前集合与另一个集合是否没有交集
print(s1.isdisjoint({3, 4})) # 输出 True
# 复制集合
s = {1, 2}
s_copy = s.copy()
print(s_copy) # 输出 {1, 2}
# 用一个集合更新当前集合
s.update({2, 3})
print(s) # 输出 {1, 2, 3}
# 集合长度
s = {1, 2, 3}
print(len(s)) # 输出 3