集合类型
这里的集合同数学意义上的集合,符合数学集合的特性,具有无序性、确定性和互异性。
集合的特点:
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]['反面角色'])