和列表很相似,最明显的不同就是集合是一个 无序 、可变、不允许数据重复的容器。
特点
- 容器
- 元素不重复
- 无序,无法通过索引取值。
- 可变,可以添加和删除元素。
1.定义
定义空集合
a = set()
注意:
1.定义空集合时,只能使用v = set()
,不能使用 v={}
(这样是定义一个空字典);
2.也不能使用 v=()
(这样是定义一个空元组)。
定义非空集合
v1 = {11, 22, 33, 44}
集合中对值的要求:
- 值:必须可哈希。目前为止学到的可哈希的类型:int/bool/str/tuple;不可哈希的类型:list/set/dict
2.操作
集合是由不重复元素组成的无序容器。基本用法包括成员检测、消除重复元素。集合对象支持合集、交集、差集、对称差分等数学运算。
2.1.增
data = {"miss", '五五开', "卢本伟"}
data.add("沐风")
print(data)
可以发现,每次运行后输出的data不一样,这是为了提醒coder集合是无序的
。
data = {"miss", '五五开', "卢本伟"}
data.add("沐风")
data.add("精易")
print(data)
data = {"miss", '五五开', "卢本伟"}
data.add("沐风", "精易") # TypeError: add() takes exactly one argument (2 given)
可以发现,集合不能批量添加元素
2.2.删
集合删除元素有两种语法:discard,remove。区别在于:如果要删除的元素不存在,后者会报错KeyError
,前者不报错。
# 语法一
data = {"miss", '五五开', "卢本伟"}
data.discard("卢本伟")
print(data) # {'五五开', 'miss'}
# 语法二
data = {"miss", '五五开', "卢本伟"}
data.remove("卢本伟")
print(data) # {'五五开', 'miss'}
2.3.改
交集
s1 = {"2021", "沐风", "598779784", "Python"}
s2 = {"2020", "精易", "446809585", "Python"}
# 语法一
s4 = s1.intersection(s2) # 取两个集合的交集
print(s4) # {'Python'}
# 语法二
s3 = s1 & s2 # 取两个集合的交集
print(s3) # {'Python'}
并集
s1 = {"2021", "沐风", "598779784", "Python"}
s2 = {"2020", "精易", "446809585", "Python"}
# 语法一
s4 = s1.union(s2) # {'2020', '2021', '446809585', 'Python', '沐风', '精易', '598779784'}
print(s4)
# 语法二
s3 = s1 | s2 # {'2020', '2021', '446809585', 'Python', '沐风', '精易', '598779784'}
print(s3)
差集
s1 = {"2021", "沐风", "598779784", "Python"}
s2 = {"2020", "精易", "446809585", "Python"}
# 语法一
s4 = s1.difference(s2) # 差集,s1中有且s2中没有的值 {'2021', '598779784', '沐风'}
s6 = s2.difference(s1) # 差集,s2中有且s1中没有的值 {'2020', '446809585', '精易'}
# 语法二
s3 = s1 - s2 # 差集,s1中有且s2中没有的值 {'598779784', '沐风', '2021'}
s5 = s2 - s1 # 差集,s2中有且s1中没有的值 {'精易', '446809585', '2020'}
2.4.查
遍历
# 只得到值
data = {"miss", '五五开', "卢本伟"}
for item in data:
print(item)
[attach]4509[/attach]
# 得到索引和值
data = {"miss", '五五开', "卢本伟"}
for v in enumerate(data):
print(v)
[attach]4510[/attach]
可以看出,每次遍历集合的顺序不一样,也说明了集合是无序的。
2.5.统计
集合长度
data = {"miss", '五五开', "卢本伟"}
print(len(data)) # 3
是否存在
score_set = (66, 88, 99, 66, 10)
print(66 in score_set) # True
print('hi' in score_set) # False
2.6.类型转换
str转set
name = "沐风开发与分析"
data = set(name) # {'开', '发', '风', '与', '沐', '分', '析'}
print(data)
list转set
data = ["miss", '五五开', "卢本伟"]
print(set(data)) # {'五五开', 'miss', '卢本伟'}
tuple转set
data = ("miss", '五五开', "卢本伟")
print(set(data)) # {'五五开', 'miss', '卢本伟'}
dict转set
info = {'age': '16', 'name': 'ecithy', 'gender': '男'}
print(set(info.keys())) # {'age', 'gender', 'name'}
print(set(info.values())) # {'ecithy', '男', '16'}