2.13 集合类型详解

集合类型

这里的集合同数学意义上的集合,符合数学集合的特性,具有无序性、确定性和互异性。

集合的特点:

1.集合元素不可更改,不能够是可变的数据类型。

2.集合用大括号来表示,,元素之间用逗号分隔。

3.建立集合用{}大括号或者是set()

4.若想建立空集合,必须使用set()

在这里插入图片描述
在这里插入图片描述

集合的概念:如下例,深入理解集合

# 集合的概念
# 建立A集合,直接使用{}
A={"易烊千玺",123,(1,2,3,4)}
# 建立B集合,用set()
B=set("pypy1123") # 相当于C
B和C集合是相等的
C={'p','y','1','2','3'}
# 根据集合的互异性,集合中不存在相同元素
D={"python",123,"python",123} #相当于C2
E={"python",123}

集合的运算法则:

同数学上的运算法则,四种基础运算为:交、差、并、补

S|T 并运算,包含在集合S和T中的所有元素,与数学上的并集一个道理,包含S和T集合所有的元素。

S&T 交运算,包含既在S中又在T中的集合,取两者相同的部分

S-T 差运算,包含在集合S中但是不在集合T中的元素

S^T 补运算,包含集合S和T中的不相同元素

四种运算共同特点就是,返回类型都是集合类型。

1.并集运算

报错信息:set()函数建立集合

A = {'1','a','c'}
B = set('b','2')
print(A|B)

这段代码我们想知道A和B集合的交集结果,B集合这么建立集合是不对的,报错信息为:

B = set('b','2')
TypeError: set expected at most 1 argument, got 2

说明用set只能添加一条元素信息,不能够填充多条。根据上面的例子,B和C集合相等,建立B集合的时候只能填充一条信息。

A = {'1','a','c','b'}
B = {'2','b'}
print(A | B)

运行结果如下:

{'b', '1', '2', 'a', 'c'}
2.交集运算
A = {'1','a','c','b'}
B = {'2','b'}
print(A & B)

交集好理解,A和B相同的元素就是b,但如果A和B没有相同的元素,他们的交集就是空集。空集是一切集合的子集。

A = {'1','a','c'}
B = {'2','b'}
print(A & B)

这个时候我们运行,看一下结果:

set()

Process finished with exit code 0

说明他们的交集就是个空集。

3.差运算
A = {'1','a','c','b'}
B = {'2','b'}
print(A - B)

运行结果下:

{'c', '1', 'a'}

差运算就是包含在集合A中但是不在集合B中的元素,A和B都有‘b’这个元素,所以打印的结果没有b这个元素,都是A里面有B里面没有的元素。每次运行顺序不一样,是由于集合的无序性。

A = {'1','a','c','b'}
B = {'2','b'}
print(B - A)

如果过来B-A,运行结果就是{‘2’}

4.补运算
A = {'1','a','c','b'}
B = {'2','b'}
print(B ^ A)

运行结果:

{'2', 'a', '1', 'c'}

补运算就是B里面包含A与其不同的元素。A和B都有相同的元素b,不算这个相同的元素,输出其他的元素。类似于数学里面的补集。

集合的关系运算

集合有两种关系运算

1.S<=T或者S<T 关系运算,返回True/False,判断S和T的子集关系

2.S>=T或者S>T 关系运算,返回True/False,判断S和T的包含关系

记忆:符号口朝左(小于号或者小于等于号),判断子集。符号口朝右,判断包含

左子集,右包含

子集的数学定义:

如果集合A的任意一个元素都是集合B的元素(任意a∈A则a∈B),那么集合A称为集合B的子集,记为A⊆B或 B⊇A,读作“集合A包含于集合B”或集合B包含集合A”

元素与集合之间的关系是“属于”,集合之间的关系是“包含”

例子:包含关系
# 例1
A = {'1','a','c','b'}
B = {'2','b'}
print(A >= B)
print(A > B)

运行结果如下

False
False

例子2:

# 例2
A = {'1','a','c','b'}
B = {'2','b'}
print(B >= B)
print(B > A)

输出结果:

True
False

从上面两个例子来看,A不包含于B,所以输出结果为False。第二个例子B和它本身关系是包含的,打印True,同时,B也不包含于A。

例子:子集关系
A = {'1','a','c','b'}
B = {'2','b'}
print(B <= A)
print(A < B)

结果都是False,说明他们不互为子集关系。

判断两个集合是否为子集关系的方法

语法:

A.issubset(B) 返回值若是True,则A是B的子集,反之则不是。

A = {'1','a','c','b'}
B = set()
C = {'1','b'}
# print(A <= B)
# print(A < B)
print(A.issubset(B))    # 判断A是否是B的子集
print(B.issubset(B))    # 判断B是否是本身的子集
print(B.issubset(A))    # 判断B是否是A的子集
print(C.issubset(A))    # 判断C是否是A的子集
print(A.issubset(C))    # 判断A是否是C的子集
print(B.issubset(C))    # 判断B是否是C的子集
print(C.issubset(B))    # 判断C是否是B的子集

我们看运行结果:

False
True
True
True
False
True
False

Process finished with exit code 0

集合处理的10个方法

1.集合中添加元素:A.add(x) 把元素x加到集合A中,就算A中已经有了x也不会报错

2.集合里移除元素:A.discard(x) 移除集合A中的元素x,就算A中没有x也不会报错

3.集合报错移除元素:A.remove(x) 移除集合A中的元素x,如果A中没有x,则会报错KeyError

4.集合清除:A.clear() 清除集合A中的所有元素

5.A.pop()从集合中随意返回A的一个值,并更新A,若A为空,则产生KeyError错误

6.A.copy()返回集合A的一个副本

7.len(A)返回集合A中的元素的数目

8.x in A 判断元素x是否包含在集合A中

9.x not in A判断元素x是否不在集合A中

10.set(x) 将其他类型的变量x转换为集合类型

集合应用场景

利用集合的互异性,可以进行数据去重:

A=["p",'y','p','y',123]
s=set(A) # 利用集合无重复元素的特点
ls_new=list(s) # 将集合转变为list

列表和字典的嵌套:

# 最外层是大括号,所以是字典嵌套列表,先找到字典的键对应的列表,再判断列表中要取出元素的偏移量
students = {
    '第一组':['小明','小红','小刚','小美'],
    '第二组':['小强','小兰','小伟','小芳']
    }
print(students['第一组'][3])
#取出'第一组'对应列表偏移量为3的元素,即'小美'

# 最外层是中括号,所以是列表嵌套字典,先判断字典是列表的第几个元素,再找出要取出的值相对应的键
scores = [
    {'小明':95,'小红':90,'小刚':100,'小美':85},
    {'小强':99,'小兰':89,'小伟':93,'小芳':88}
    ]
print(scores[1]['小强'])
#先定位到列表偏移量为1的元素,即第二个字典,再取出字典里键为'小强'对应的值,即99。

练习:1.打印出字典students里的小刚 2.打印出列表scores里小刚的分数100。

students = {
    '第一组':['小明','小红','小刚','小美'],
    '第二组':['小强','小兰','小伟','小芳']
    }
scores = [
    {'小明':95,'小红':90,'小刚':100,'小美':85},
    {'小强':99,'小兰':89,'小伟':93,'小芳':88}
    ]   

print(students['第一组'][2])
print(scores[0]['小刚'])

进阶练习:打印出“狼”:

townee = [
    {'海底王国':['小美人鱼''海之王''小美人鱼的祖母''五位姐姐'],
     '上层世界':['王子','邻国公主']},

    '丑小鸭','坚定的锡兵','睡美人','青蛙王子',
    [{'主角':'小红帽','配角1':'外婆','配角2':'猎人'},{'反面角色':'狼'}]
    ]

print(townee[5][1]['反面角色'])
  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值