Python之set集合详解

定义

set(集合)是Python中常见的一种数据类型。集合中的元素是无序唯一的,它主要用于进行关系测试消除重复元素。集合对象还支持union(联合),intersection(交集),difference(差集),sysmmetric difference(对称差集)等数学运算。

创建集合set

创建空集合

s = set()  # 空集合
print(type(s))  # <class 'set'>
s1 = {}  # 空字典
print(type(s1))  # <class 'dict'>

注意:想要创建空集合,你必须使用set()而不是{},后者用于创建空字典。

创建非空集合

s1 = {1, 2, 3}
print(s1)

s2 = set('HelloWorld')
print(s2)

结果如下

{1, 2, 3}
{'l', 'o', 'W', 'H', 'r', 'd', 'e'}

常用的集合方法

s.add() - 向集合中添加元素

s = {'a', 'b', 'c'}
s.add(666)
print(s)  # {'b', 666, 'c', 'a'}

s.remove() - 删除集合中的元素

s = {'a', 'b', 'c'}
s.remove('a')
print(s)  # {'b', 'c'}
s.remove('d')  # 删除集合中不存在的元素会报KeyError错误

s.pop() - 删除并返回任意的集合元素(随机删除)

s = {'a', 'b', 'c'}
s.pop()  # 删除时无序的随机删除
print(s)  # {'a', 'b'}

s.discard() - 删除集合中的元素

s = {'a', 'b', 'c'}
s.discard('a')
s.discard('d')  # 如果元素不存在则不执行任何操作
print(s)  # {'c', 'b'}

s.clear() - 清空集合

s = {'a', 'b', 'c'}
s.clear()
print(s)  # set()

s.copy() - 浅拷贝一个集合

s1 = {'a', 'b', 'c'}  # 可变集合
s2 = frozenset(s1)  # 不可变集合
s1_cp = s1.copy()
s2_cp = s2.copy()
print(s1, s1_cp, id(s1), id(s1_cp))
print(s2, s2_cp, id(s2), id(s2_cp))

结果如下

{'c', 'a', 'b'} {'c', 'a', 'b'} 2553599288040 2553852385768
frozenset({'c', 'a', 'b'}) frozenset({'c', 'a', 'b'}) 2553597533768 2553597533768

在python中,set属于可变类型,fronzenset则属于不可变类型。

可变对象的浅拷贝,整体地址不一样,但是内部元素都是同一个地址(你可以尝试遍历集合中的元素来查看元素的地址);

而不可变对象的浅拷贝,整体地址和内部元素都是同一个地址。

s1.issubset(s2) - 子集

子集,为某个集合中一部分的集合,故亦称部分集合。

使用操作符 < 执行子集操作,同样地,也可使用方法 issubset() 完成。

s1 = {'a', 'b'}
s2 = {'a', 'b', 'c', 'd'}
s3 = {'a', 'c'}
print(s1.issubset(s2))  # True
print(s1 < s2)  # True
print(s1 < s3)  # False

s1.intersection(s2) - 交集

两个集合 A 和 B 的交集是含有所有既属于 A 又属于 B 的元素,而没有其他元素的集合。

使用 & 操作符执行交集操作,同样地,也可使用方法 intersection() 完成。

s1 = {'a', 'b', 'c'}
s2 = {'a', 'b', 'd'}
s3 = s1.intersection(s2)
s4 = s1 & s2  # 效果同上
print(s3)  # {'b', 'a'}
print(s4)  # {'b', 'a'}

s1.union(s2) - 并集

一组集合的并集是这些集合的所有元素构成的集合,而不包含其他元素。

使用操作符 | 执行并集操作,同样地,也可使用方法 union() 完成。

s1 = {'a', 'b', 'c'}
s2 = {'a', 'b', 'd'}
s3 = s1.union(s2)
s4 = s1 | s2  # 效果同上
print(s3)  # {'a', 'b', 'd', 'c'}
print(s4)  # {'a', 'b', 'd', 'c'}

s1.difference(s2) - 差集

A 与 B 的差集是所有属于 A 且不属于 B 的元素构成的集合。

使用操作符 - 执行差集操作,同样地,也可使用方法 difference() 完成。

s1 = {'a', 'b', 'c'}
s2 = {'a', 'b', 'd'}
s3 = s1.difference(s2)
s4 = s1 - s2  # 效果同上
print(s3)  # {'c'}
print(s4)  # {'c'}

s1.symmetric_difference(s2) - 对称差

两个集合的对称差是只属于其中一个集合,而不属于另一个集合的元素组成的集合。

使用 ^ 操作符执行差集操作,同样地,也可使用方法 symmetric_difference() 完成。

s1 = {'a', 'b', 'c', 'd'}
s2 = {'a', 'b', 'e', 'f'}
s3 = s1.symmetric_difference(s2)
s4 = s1 ^ s2
print(s3)  # {'c', 'e', 'f', 'd'}
print(s4)  # {'c', 'e', 'f', 'd'}

s.update() - 更新集合

s = {'a', 'b', 'c'}
s.update('d')
print(s)  # {'b', 'a', 'c', 'd'}
s.update({'e', 'f'})
print(s)  # {'a', 'f', 'd', 'e', 'b', 'c'}
s.update(['g', 'h'])
print(s)  # {'h', 'a', 'f', 'd', 'e', 'g', 'b', 'c'}
posted @ 2021-06-02 16:54  蓝莓薄荷  阅读(951)  评论(0编辑  收藏  举报