文章目录
1. 什么是集合(set)
集合(set)跟我们学过的列表(list)有点像,也可以存放一堆数据,不过它有几个独特的特点:
- 集合中的元素不可变。
- 集合中可以存放字符串、数字、元组等不可变类型,不能存放列表、字典。
- 天生去重,在集合里没办法存重复的元素。
- 无序,不像列表一样通过索引来标记元素的位置。因为集合中的元素是无序的,所以{3,4,5}和{3,5,4}算作同一个集合。
基于集合的这些特定,我们常用它来进行去重和关系运算。
2. 集合的创建
# 方式1: 使用大括号创建集合
set_1 = {1, 2, 3, "hello"}
print(set_1)
# 方式2:使用set()将可迭代对象转换为集合
# 将列表转换为集合
set_2 = set([1, 2, 3, "hello"])
# 将字符串转换为集合
set_3 = set("12345")
print(set_2)
print(set_3)
注:创建一个空集合,不能使用null_set = {}
的方式,只能用null_set = set()
。因为null_set = {}
创建的是一个空字典。
null_set = {}
type(null_set) # 验证null_set的数据类型
null_set = set()
type(null_set) # 验证null_set的数据类型
利用集合,可以快速删除列表中的重复元素:
list_a = [1, 2, 3, 5, 1, 2, 4, 5]
set_a = set(list_a) # 将列表转换成集合,删除重复元素
list_b = list(set_a) # 将集合再转换成列表
print(list_b)
3. add(): 向集合中增加元素
students = {"Tom", "Lucy", "Lily"}
print(students)
# 向集合中添加元素"James"
students.add("James")
print(students)
# 向结合中添加元素"Tom",因为”Tom"在集合中已经存在,所以集合不会发生改变
students.add("Tom")
print(students)
4. update(): 向集合中增加元素
update()
也可以用来向集合中增加元素,比较特殊的是,它的参数可以是列表、元组、字典等。
# 示例1: 以列表作为update()参数
students = {"Tom", "Lucy", "Lily"}
add_list = ["老张", "老王"]
students.update(add_list)
print(students)
# 示例2: 以多个列表作为update()参数
students = {"Tom", "Lucy", "Lily"}
add_list_1 = ["老张", "老王"]
add_list_2 = ["老陈", "老刘"]
students.update(add_list_1, add_list_2)
print(students)
# 示例3:以元组作为update()参数
students = {"Tom", "Lucy", "Lily"}
add_tuple = ("老张", "老刘")
students.update(add_tuple)
print(students)
# 示例4:以集合作为update()参数
students = {"Tom", "Lucy", "Lily"}
add_set = {"老张", "老刘"}
students.update(add_set)
print(students)
# 示例5:以字典作为update()参数
# 注意,以字典作为update()参数时,只会把字典的key添加到集合中
students = {"Tom", "Lucy", "Lily"}
add_dict = {"老张":0, "老刘":1}
students.update(add_dict)
print(students)
5. discard(): 删除集合中的指定元素
discard()
用于从集合中删除指定元素,如果元素在集合中不存在,程序运行不会出错。
students = {"Tom", "Lucy", "Lily"}
# 删除元素"Lily"
students.discard("Lily")
print(students)
# 尝试删除一个不存在的元素
students.discard("James")
print(students)
6. remove(): 删除集合中的指定元素
remove()
用于从集合中删除指定元素,如果元素在集合中不存在,则程序运行出错。
students = {"Tom", "Lucy", "Lily"}
# 删除元素"Lily"
students.remove("Lily")
print(students)
# 尝试删除一个不存在的元素
students.remove("James")
7. pop(): 随机删除集合中一个元素
students = {"Tom", "Lucy", "Lily"}
# 使用pop()随机删除一个元素,并将该元素返回
name = students.pop()
print("从集合中删除了{}。".format(name))
8. in: 判定元素是否在集合中
students = {"Tom", "Lucy", "Lily"}
if "Lucy" in students:
print("Lucy在集合中。")
else:
print("Lucy不在集合中。")
9. clear(): 清空集合
students = {"Tom", "Lucy", "Lily"}
print(students)
students.clear()
print(students)
10. len(): 集合中元素的个数
students = {"Tom", "Lucy", "Lily"}
print(len(students))
11. 关系运算
假设现在有两个兴趣班,一个学习C语言,一个学习Python。现在将这两个班里的学生名字保存为两个集合:
# C语言班的学生
c_students = {"老王", "老张", "老刘"}
# Python班的学生
p_students = {"老赵", "老钱", "老王"}
11.1 求两个集合的交集: &
交集:两个集合中都包含的元素。
# C语言班的学生
c_students = {"老王", "老张", "老刘"}
# Python班的学生
p_students = {"老赵", "老钱", "老王"}
# 获取同时参加两门课的学生名单
print(c_students & p_students)
11.2 求两个集合的并集(也称为合集): |
并集:两个集合中的所有元素汇总。
# C语言班的学生
c_students = {"老王", "老张", "老刘"}
# Python班的学生
p_students = {"老赵", "老钱", "老王"}
# 获取两门课所有学生的名单
print(c_students & p_students)
11.3 求两个集合的差集
差集:属于集合A,但是不属于集合B的元素
# C语言班的学生
c_students = {"老王", "老张", "老刘"}
# Python班的学生
p_students = {"老赵", "老钱", "老王"}
# 参加了C语言班,但是没参加Python班的学生
print(c_students - p_students)
# 参加了Python语言班,但是没参加C语言班的学生
print(p_students - c_students)
11.4 求两个集合的对称差集: ^
对称差集:只属于一个集合的元素,也就是将两个集合求合集之后,再去除两个集合的交集。(换句话说就是把脚踏两条船的人给删掉)
# C语言班的学生
c_students = {"老王", "老张", "老刘"}
# Python班的学生
p_students = {"老赵", "老钱", "老王"}
# 只报了一门课程的学生名单
print(c_students ^ p_students)
11.5 判断两个集合是否相交:isdisjoint()
也就是判断两个集合有没有共同元素。如果没有共同元素,则返回True;如果有共同元素,则返回False。
# C语言班的学生
c_students = {"老王", "老张", "老刘"}
# Python班的学生
p_students = {"老赵", "老钱", "老王"}
# 判定C班的名单和Python班的名单有没有重合的,如果没有,则返回True
if c_students.isdisjoint(p_students):
print("C班的学生都没有学Python。")
else:
print("C班的学生有学Python的。")
11.6 判断一个集合是不是另一个集合的子集:issubset()
也就是集合A的元素是不是都在集合B中能找到。
# C语言班的学生
c_students = {"老王", "老张", "老刘"}
# Python班的学生
p_students = {"老赵", "老钱", "老王", "老张", "老刘"}
# 判断C班的学生是不是都在Python班的名单中,如果是,则返回True。
if c_students.issubset(p_students):
print("C语言班的同学都在学Python。")
else:
print("并不是所有C语言班同学都在学Python。")
11.7 判断一个集合是不是另一个集合的父集:issuperset()
也就是判断集合A是不是包含了集合B的所有元素。
# C语言班的学生
c_students = {"老赵", "老钱", "老王", "老张", "老刘"}
# Python班的学生
p_students = {"老赵", "老钱", "老王"}
# 判断C班的学生名单是不是包含了Python班的所有学生,如果是,则返回True。
if c_students.issuperset(p_students):
print("Python班的所有同学都在学C。")
else:
print("Python班并不是所有同学都在学C。")