Python中的set操作

269 阅读4分钟

在 Python 中,set 是一种无序、不重复元素的可变集合类型,set 是一种内置的数据结构,用于存储唯一的元素。它提供了许多操作来处理集合,例如添加元素、删除元素、求交集、并集、差集等,常用于去重和快速成员检测,其中set 最显著的特点是可以自动去重,这在处理数据时非常有用。
set相关的操作代码示例如下:

# 直接创建集合
# 要创建空集合,必须使用 set() 函数,因为 {} 会创建一个空字典。
s0 = set()
s1 = {1, 2, 3}
l1 = [2, 3, 4]
s2 = set(l1)  # 从列表转换
s3 = set("hello")  # 字符串转为字符集合(去重)
print(s0)  # 输出:set()
print(s1)  # 输出:{1, 2, 3}
print(s2)  # 输出:{2, 3, 4}
print(s3)  # 输出:{'h', 'e', 'l', 'o'} 或 {'e', 'o', 'l', 'h'}

list1 = [2, 3, 4]
list2 = [4, 5, 6]
list3 = [6, 7, 8]
# set() 函数可以将其他可迭代对象(如列表、元组等)转换为集合,并且会自动去除重复元素。
s2 = set(list1 + list2)
# 或者使用 set(item for item in list1 + list2)
s3 = set(item for item in list1 + list2)
print(s2)  # 输出: {2, 3, 4, 5, 6}
print(s3)  # 输出: {2, 3, 4, 5, 6}
s4 = set(list1)
print(s4)  # 输出:{2, 3, 4}
s4.update(list2)
s4.update(list3)
print(f"call update to add:{s4}")  # 输出:call update to add:{2, 3, 4, 5, 6, 7, 8}

import itertools

# 使用 itertools.chain 来合并列表(对于多个列表很有用)
s5 = itertools.chain(list1, list2, list3)
print(f"call itertools.chain:{s5}")
s6 = set(s5)
print(f"call itertools.chain set:{s6}")

# 添加/删除元素
s = {1, 2, 3}

# 添加元素
s.add(4)  # 添加单个元素
s.update([5, 6])  # 添加多个元素(合并可迭代对象)
print(s)  # 输出:{1, 2, 3, 4, 5, 6}

# 删除元素
s.remove(1)  # 删除元素(若元素不存在会报 KeyError)
print(s)  # 输出:{2, 3, 4, 5, 6}
s.discard(100)  # 删除元素(元素不存在不会报错)
popped = s.pop()  # 随机删除并返回一个元素(集合无序)
print(popped)  # 可能输出 2(取决于实现)

# 集合运算
# 并集 (Union),union() 方法返回两个集合的并集,即包含两个集合中所有不重复元素的集合。
a = {1, 2, 3}
b = {3, 4, 5}
print(a | b)  # 运算符方式,输出:{1, 2, 3, 4, 5}
print(a.union(b))  # 方法可接受任意可迭代对象,输出:{1, 2, 3, 4, 5}

# 交集 (Intersection),intersection() 方法返回两个集合的交集,即包含两个集合中共同元素的集合。
print(a & b)  # 输出:{3}
print(a.intersection(b))  # 输出:{3}

# 差集 (Difference)
# difference() 方法返回一个集合相对于另一个集合的差集,即只在第一个集合中出现而不在第二个集合中出现的元素组成的集合。
# a 有但 b 没有
print(a - b)  # 输出:{1, 2}
print(a.difference(b))  # 输出:{1, 2}

# 对称差集 (Symmetric Difference)
# symmetric_difference() 方法返回两个集合的对称差集,即只在其中一个集合中出现的元素组成的集合。
# 仅在 ab 中,不同时存在
print(a ^ b)  # 输出:{1, 2, 4, 5}
print(a.symmetric_difference(b))  # 输出:{1, 2, 4, 5}

# 集合关系判断
x = {1, 2}
y = {1, 2, 3}

# 子集/超集
# x <= y:判断集合x是否是集合y的子集。如果是,返回True;否则,返回False。
print(x <= y)  # x 是 y 的子集,输出:True
# y.issuperset(x):判断集合y是否是集合x的超集。如果是,返回True;否则,返回False。
print(y.issuperset(x))  # y 是 x 的超集,返回:True

# 交集判断
# x.isdisjoint(y):判断集合x和集合y是否没有交集。如果没有交集(即它们没有共同的元素),返回True;否则,返回False。
print(x.isdisjoint(y))  # 有交集,输出:False
print(not x.isdisjoint(y))  # x 和 y 有交集,输出:True
print(x.isdisjoint({4, 5}))  # 无交集,输出:True

# 清空集合
ll = [1, 2, 3]
s = set(ll)
print(len(s))  # 集合的长度,输出:3
s.clear()
print(s)  # 输出: set()

# 集合的更新操作
set1 = {1, 2, 3, 4, 5}
set2 = {4, 5, 6, 7, 8}

# 更新并集,update() 方法用于将另一个集合中的元素添加到当前集合中,相当于更新并集。
set1.update(set2)
print("更新并集后的集合 set1:", set1)  # 输出:更新并集后的集合 set1: {1, 2, 3, 4, 5, 6, 7, 8}

# 更新交集,intersection_update() 方法用于更新当前集合,使其只包含与另一个集合的交集元素。
set1 = {1, 2, 3, 4, 5}
set1.intersection_update(set2)
print("更新交集后的集合 set1:", set1)  # 输出:更新交集后的集合 set1: {4, 5}

# 更新差集,difference_update() 方法用于更新当前集合,使其只包含相对于另一个集合的差集元素。
set1 = {1, 2, 3, 4, 5}
set1.difference_update(set2)
print("更新差集后的集合 set1:", set1)  # 输出:更新差集后的集合 set1: {1, 2, 3}

# 更新对称差集,symmetric_difference_update() 方法用于更新当前集合,使其只包含与另一个集合的对称差集元素。
set1 = {1, 2, 3, 4, 5}
set1.symmetric_difference_update(set2)
print("更新对称差集后的集合 set1:", set1)  # 输出:更新对称差集后的集合 set1: {1, 2, 3, 6, 7, 8}