Python 集合
集合
Python中的集合,类型是set。
集合中的元素必须是可hash的,即只能存储不可变类型,但是集合本身又是可变类型,即可以对集合中的元素进行增删改查。
基本声明
集合中的元素必须是不可变类型。
以下是使用类的形式进行声明:
s = set((1, 2, 3, 4, 5))
print("值:%s,类型%s" % (s, type(s)))
# 值:{1, 2, 3, 4, 5},类型<class 'set'>
也可以选择使用更方便的字面量形式,使用{}对元素进行包裹,每个元素间用,进行分割:
s = {1, 2, 3, 4, 5}
print("值:%s,类型%s" % (s, type(s)))
# 值:{1, 2, 3, 4, 5},类型<class 'set'>
类型转换
集合可以与bool、list、tuple、str等进行转换:
s = {1, 2, 3, 4, 5}
b_set = bool(s) # 布尔类型
str_set = str(s) # 字符串类型
li_set = list(s) # 字符串类型
tup_set = tuple(s) # 字符串类型
print("值:%s,类型:%s"%(b_set,type(b_set)))
print("值:%s,类型:%s"%(str_set,type(str_set)))
print("值:%s,类型:%s"%(li_set,type(li_set)))
print("值:%s,类型:%s"%(tup_set,type(tup_set)))
# 值:True,类型:<class 'bool'>
# 值:{1, 2, 3, 4, 5},类型:<class 'str'>
# 值:[1, 2, 3, 4, 5],类型:<class 'list'>
# 值:(1, 2, 3, 4, 5),类型:<class 'tuple'>
使用方式
集合更多的作用是来操纵数据,而并非存储数据。
如何正确的使用集合?这就要利用到集合中去重的特性,如下示例中,我们想对list中的元素进行去重,就可以将其先转变为set后再转变成list:
l = [1, 2, 3, 2, 3, 3, 2, 1]
s = set(l)
l = list(s)
print(l)
# [1, 2, 3]
其他特性
集合的元素都是进行hash存储。
集合本身属于一种容器类型。
集合的查找速度是非常快的。
集合中元素的顺序不是有序的,而是无序的。
常用方法
集合最重要的操作手法就是去重以及关系运算(求交差并集)
关系图解

符号操纵
集合中关于关系的运算可以使用符号进行操纵:
# ==== set方法之关系运算(符号篇) ====
set1 = {1, 2, 3, 4, 5}
set2 = {4, 5, 6, 7, 8}
# -- 交集 --
print(set1 & set2) # {4, 5}
# -- 差集 --
print(set1 - set2) # {1, 2, 3}
print(set2 - set1) # {8, 6, 7} 集合无序
# -- 合集/并集 --
print(set1 | set2) # {1, 2, 3, 4, 5, 6, 7, 8}
# -- 对称差集 --
print(set1 ^ set2) # {1, 2, 3, 6, 7, 8}
# -- 父级 --
set3 = {1, 2, 3, 4}
set4 = {1, 2}
print(set3 > set4) # True
print(set3 >= set4) # True
# -- 子级 --
print(set4 < set3) # True
print(set4 <= set3) # True
# ====== 两个集合相等 ======= 互为父子关系
方法操纵
除开使用符号操纵,也可以使用方法进行操纵:
# ==== set方法之关系运算(方法篇) ====
set1 = {1, 2, 3, 4, 5}
set2 = {4, 5, 6, 7, 8}
# -- 交集 --
print(set1.intersection(set2)) # {4, 5}
# -- 差集 --
print(set1.difference(set2)) # {1, 2, 3}
print(set2.difference(set1)) # {8, 6, 7} 集合无序
# -- 合集/并集 --
print(set1.union(set2)) # {1, 2, 3, 4, 5, 6, 7, 8}
# -- 对称差集 --
print(set1.symmetric_difference(set2)) # {1, 2, 3, 6, 7, 8}
# -- 父级 --
set3 = {1, 2, 3, 4}
set4 = {1, 2}
print(set3.issuperset(set3)) # True
# -- 子级 --
print(set4.issubset(set3)) # True
# ====== 两个集合相等 ======= 互为父子关系
其他操作
以下的操作都很少使用,了解即可:
# ==== set方法的其他操作 ====
# --- 去重 --- 不举例,这个是集合的特性。上两章举过例子了。
set5 = {1, 2}
set5.add(3)
print(set5) # {1, 2, 3} add() 为集合中添加一个元素
set6 = set5.copy() # copy() 浅拷贝
print(set5.pop()) # 从集合中随机弹出并删除元素(集合无序所以随机)。不可指定index(set不支持index)
set5.remove(2) # 将指定元素从集合中删除。如果元素不存在集合中则抛出异常
print(set5) # {3}
set5.discard(5) # 同 remove(),但是如果元素不存在于集合中也不会抛出异常。
set5.clear() # 清空集合
print(set5) # set()
set5.update({1, 2, 3, 4, 5, 6, 7}) # 更新集合
print(set5) # {1, 2, 3, 4, 5, 6, 7}
# 求出差集后赋值给set5 。(注意:单纯的difference只是生成新对象,并不会覆盖原值)
set5.difference_update({1, 2, 3, 4})
print(set5) # {5, 6, 7}
print(set5.isdisjoint({"a,b,c"})) # True 两个集合完全独立没有共同部分返回 True
set6 = frozenset({1, 2, 3, }) # 创建一个不可变的set。(可迭代对象)
注意事项
由于集合中的元素必须是不可变类型,所以你不可以存入以下数据类型:
- 列表
- 字典
- 集合

浙公网安备 33010602011771号