Python集合

1、set

Python 还包含了一个数据类型 —— set (集合)。集合是一个无序不重复元素的集。基本功能包括关系测试和消除重复元素。集合对象还支持 union(联合),intersection(交),difference(差)和 sysmmetric difference(对称差集)等数学运算。

1.1 创建集合

set集合类需要的参数必须是迭代器类型的,如:序列、字典等,然后转换成无序不重复的元素集。由于集合是不重复的,所以可以对字符串、列表、元组进行去重操作。

创建空集合

# 创建空集合
s=set()
# 创建列表类型集合
s1=set([]) #列表
# 创建元组类型集合
s2=set(()) #元组
# 创建字典类型集合
s3=set({}) #字典

创建非空集合

>>> s1=set([1,2,3,4])
>>> s1
{1, 2, 3, 4}
  
>>> s3=set({'a':2,'b':3,'c':4})
>>> s3
{'c', 'a', 'b'}

1.2 集合的操作

1.2.1 集合添加

集合的添加有两种方式,分别是add和update。但是它们在添加元素时是由区别的:

add()方法

把要传入的元素作为一个整体添加到集合中,如:

>>> s=set('one')
>>> s
{'e', 'o', 'n'}
>>> s.add('two')
>>> s
{'e', 'two', 'o', 'n'}

update()方法

是把要传入的元素拆分成单个字符,存于集合中,并去掉重复的字符。可以一次添加多个值,如:

>>> s=set('one')
>>> s
{'e', 'o', 'n'}
>>> s.update('two')
>>> s
{'e', 'n', 't', 'w', 'o'}

1.2.2 集合删除

集合的删除操作使用的方法跟列表是一样的,使用的也是remove方法。如:

remove(element) element :表示要查找并删除的元素 在集合setVar中查找element元素,如果存在则删除;如果没找到,则报错。
discard(element) element :表示要查找并删除的元素 在集合setVar中查找element元素,如果存在则删除;如果没找到,则什么也不做。
pop() 删除并返回set类型的s中的一个不确定的元素,如果为空引发KeyError错误。
clear() 清空s集合中的所有元素

remove(element)

>>> s=set('one')
>>> s
{'e', 'o', 'n'}
>>> s.remove('e')
>>> s
{'n', 'o'}

discard(element)

>>> sList
set([1, 2, 3, 4, 5])
>>> sList.discard(1)
>>> sList
set([2, 3, 4, 5])

pop()

>>> sList
set([2, 3, 4, 5])
>>> sList.pop()
2

clear()

>>> sList
set([3, 4, 5])
>>> sList.clear()
>>> sList
set([])

1.2.3 集合的遍历

集合的遍历跟序列的遍历方法完全一样。

>>> s=set('one')
>>> s
{'e', 'o', 'n'}
>>> for i in s:
print(i)
... ...
e
o
n

另一种遍历方式:

>>> s=set('one')
>>> s
{'e', 'o', 'n'}
>>> for idex,i in enumerate(s):
print (idex,i)
... ...
0 e
1 o
2 n

1.3 集合交叉并补

既然是集合,那就会遵循集合的一些操作方法,如求交集、并集、差集等。

Python中求集合的交集使用的符号是“&”,返回连个集合的共同元素的集合,即集合的交集。

运算操作 Python运算符 含义 例子
交集 & 取两集合公共的元素 >>> set1 & set2
并集 | 取两集合全部的元素 >>> set1
差集 - 取一个集合中另一集合没有的元素 >>> set1 - set2
{1,2}
>>> set2 - set1
对称差集 ^ 取集合 A 和 B 中不属于 A&B 的元素 >>> set1 ^ set2

1.3.1 交集

Python中求集合的交集使用的符号是“&”,返回连个集合的共同元素的集合,即集合的交集。

>>> st1 = set('python')
>>> st1
set(['h', 'o', 'n', 'p', 't', 'y'])
>>> st2 = set('htc')
>>> st2
set(['h', 'c', 't'])
>>> st1 & st2
set(['h', 't'])

1.3.2 并集(合集)

Python中求集合的并集用的是符号“|”,返回的是两个集合所有的并去掉重复的元素的集合。

>>> st1
set(['h', 'o', 'n', 'p', 't', 'y'])
>>> st3 = set('two')
>>> st3
set(['o', 't', 'w'])
>>> st1 | st3
set(['p', 't', 'w', 'y', 'h', 'o', 'n'])

1.3.3 差集

Python中差集使用的符号是减号“-”。

>>> st1
set(['1', '3', '2', '5', '4', '7', '6'])
>>> st2 = set('4589')
>>> st2
set(['9', '8', '5', '4'])
>>> st1 - st2
set(['1', '3', '2', '7', '6'])

返回的结果是在集合st1中但不在集合st2中的元素的集合

1.3.4 集合的不同

查看两个集合的不同之处,使用的difference函数,等价于差集。如:

s1.difference(s3)

这种不同指的是集合s3相对于集合s1,不同的地方,也就是所有在集合s1中,而不再集合s2中的的元素组成的新集合。

>>> s1
set([1, 2, 3, 4, 5])
>>> s2
set([1, 2, 3, 4])
>>> s1.difference(s2)
set([5])
>>> s3
set(['1', '8', '9', '5'])
>>> s1.difference(s3)
set([1, 2, 3, 4, 5])

1.3.5 集合补集

set1=set([1,2,3])
set2=set([3,4,5])
set1 ^ set2
>>> {1, 2, 4, 5}

对称差集符号^等价于方法symmetric_difference

set1 = set([1, 2, 3])
set2 = set([3, 4, 5])
set1.symmetric_difference(set2)
>>> {1, 2, 4, 5}

1.4 集合的范围判断

集合可以使用大于(>)、小于(<)、大于等于(>=)、小于等于(<=)、等于(==)、不等于(!=)来判断某个集合是否完全包含于另一个集合,也可以使用子父集判断函数。

定义三个集合s1,s2,s3:

>>> s1=set([1, 2, 3, 4, 5])
>>> s2=set([1, 2, 3, 4])
>>> s3=set(['1', '8', '9', '5'])

1.4.1 大于(>)或大于等于(>=)

>>> s1 > s2
True
>>> s1 > s3
False
>>> s1 >= s2
True

表示左边集合是否完全包含右边集合,如集合s1是否完全包含集合s2。

1.4.2 小于(<)或 小于等于(<=)

>>> s2 < s1
True
>>> s1 < s3
False
>>> s3 < s1
False

表示左边的集合是否完全包含于右边的集合,如集合s1是否完全包含于集合s2。

1.4.3 等于(==)、不等于(!=)

>>> s1 == s2
False
>>> s2 == s3
False
>>> s1 != s2
True

1.5 不可变集合frozenset

Python中还有一种不可改变的集合,那就是frozenset,不像set集合,可以增加删除集合中的元素,该集合中的内容是不可改变的,类似于字符串、元组。

>>> f = frozenset()
>>> f
frozenset([])
>>> f = frozenset('asdf')
>>> f
frozenset(['a', 's', 'd', 'f'])
>>> f = frozenset([1,2,3,4])
>>> f
frozenset([1, 2, 3, 4])
>>> f = frozenset((1,2,3,4))
>>> f
frozenset([1, 2, 3, 4])
>>> f = frozenset({1:2, 'a':2, 'c':3})
>>> f
frozenset(['a', 1, 'c'])

如果试图改变不可变集合中的元素,就会报AttributeError错误。
不可变集合,除了内容不能更改外,其他功能及操作跟可变集合set一样。

posted @   饮一杯天上水  阅读(186)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· 单线程的Redis速度为什么快?
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
点击右上角即可分享
微信分享提示