Python连载(0014): 集合(set)

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)

image-20210130141409268

注:创建一个空集合,不能使用null_set = {}的方式,只能用null_set = set()。因为null_set = {}创建的是一个空字典。

null_set = {}
type(null_set)	# 验证null_set的数据类型

null_set = set()
type(null_set)	# 验证null_set的数据类型

image-20210130141637091

利用集合,可以快速删除列表中的重复元素:

list_a = [1, 2, 3, 5, 1, 2, 4, 5]
set_a = set(list_a)		# 将列表转换成集合,删除重复元素
list_b = list(set_a)	# 将集合再转换成列表
print(list_b)

image-20210130151419251

3. add(): 向集合中增加元素

students = {"Tom", "Lucy", "Lily"}
print(students)

# 向集合中添加元素"James"
students.add("James")
print(students)

# 向结合中添加元素"Tom",因为”Tom"在集合中已经存在,所以集合不会发生改变
students.add("Tom")
print(students)

image-20210130143341902

4. update(): 向集合中增加元素

update()也可以用来向集合中增加元素,比较特殊的是,它的参数可以是列表、元组、字典等。

# 示例1: 以列表作为update()参数
students = {"Tom", "Lucy", "Lily"}

add_list = ["老张", "老王"]
students.update(add_list)
print(students)

image-20210130143721033

# 示例2: 以多个列表作为update()参数
students = {"Tom", "Lucy", "Lily"}

add_list_1 = ["老张", "老王"]
add_list_2 = ["老陈", "老刘"]
students.update(add_list_1, add_list_2)
print(students)

image-20210130143838064

# 示例3:以元组作为update()参数
students = {"Tom", "Lucy", "Lily"}
add_tuple = ("老张", "老刘")
students.update(add_tuple)
print(students)

image-20210130144134597

# 示例4:以集合作为update()参数
students = {"Tom", "Lucy", "Lily"}
add_set = {"老张", "老刘"}
students.update(add_set)
print(students)

image-20210130144307957

# 示例5:以字典作为update()参数
# 注意,以字典作为update()参数时,只会把字典的key添加到集合中
students = {"Tom", "Lucy", "Lily"}
add_dict = {"老张":0, "老刘":1}
students.update(add_dict)
print(students)

image-20210130144446152

5. discard(): 删除集合中的指定元素

discard()用于从集合中删除指定元素,如果元素在集合中不存在,程序运行不会出错。

students = {"Tom", "Lucy", "Lily"}

# 删除元素"Lily"
students.discard("Lily")
print(students)

# 尝试删除一个不存在的元素
students.discard("James")
print(students)

image-20210130143102805

6. remove(): 删除集合中的指定元素

remove()用于从集合中删除指定元素,如果元素在集合中不存在,则程序运行出错。

students = {"Tom", "Lucy", "Lily"}

# 删除元素"Lily"
students.remove("Lily")
print(students)

# 尝试删除一个不存在的元素
students.remove("James")

image-20210130142917768

7. pop(): 随机删除集合中一个元素

students = {"Tom", "Lucy", "Lily"}

# 使用pop()随机删除一个元素,并将该元素返回
name = students.pop()
print("从集合中删除了{}。".format(name))

image-20210130142634728

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)

image-20210130151005685

10. len(): 集合中元素的个数

students = {"Tom", "Lucy", "Lily"}
print(len(students))

image-20210130151106028

11. 关系运算

假设现在有两个兴趣班,一个学习C语言,一个学习Python。现在将这两个班里的学生名字保存为两个集合:

# C语言班的学生
c_students = {"老王", "老张", "老刘"}

# Python班的学生
p_students = {"老赵", "老钱", "老王"}

11.1 求两个集合的交集: &

交集:两个集合中都包含的元素。

# C语言班的学生
c_students = {"老王", "老张", "老刘"}

# Python班的学生
p_students = {"老赵", "老钱", "老王"}

# 获取同时参加两门课的学生名单
print(c_students & p_students)

image-20210130152009391

11.2 求两个集合的并集(也称为合集): |

并集:两个集合中的所有元素汇总。

# C语言班的学生
c_students = {"老王", "老张", "老刘"}

# Python班的学生
p_students = {"老赵", "老钱", "老王"}

# 获取两门课所有学生的名单
print(c_students & p_students)

image-20210130152143390

11.3 求两个集合的差集

差集:属于集合A,但是不属于集合B的元素

# C语言班的学生
c_students = {"老王", "老张", "老刘"}

# Python班的学生
p_students = {"老赵", "老钱", "老王"}

# 参加了C语言班,但是没参加Python班的学生
print(c_students - p_students)

# 参加了Python语言班,但是没参加C语言班的学生
print(p_students - c_students)

image-20210130152421234

11.4 求两个集合的对称差集: ^

对称差集:只属于一个集合的元素,也就是将两个集合求合集之后,再去除两个集合的交集。(换句话说就是把脚踏两条船的人给删掉)

# C语言班的学生
c_students = {"老王", "老张", "老刘"}

# Python班的学生
p_students = {"老赵", "老钱", "老王"}

# 只报了一门课程的学生名单
print(c_students ^ p_students)

image-20210130152918393

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。")
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值