10 集合
10.1 集合的定义及基本操作
code:
# **********************************************************
"""
集合:确定的一组无序的数据的组合
确定:当前集合中元素的值不能重复
由多个数据组合的复合型数据(容器类型数据)
无序的
功能:成员检测,从序列中去除重复项以及数学中的集合类计算,例如交集、并集、差集和对称差集等等
集合的定义
1.使用{}定义集合
2.set()函数定义集合或强制类型转换
3.集合推导式定义集合
注意:集合中的元素不能重复,集合中存放的数据:Number,Strings,Tuple,冰冻集合。字典和列表不能作为集合的元素
True在集合中表示为1,False在集合中表示为0。所以True和1只有一个能存在,False和0只有一个能存在。
由于集合中的元素都不可以改变,因此不涉及到深拷贝的问题
集合的函数
frozenset([iterable])---返回一个冰冻集合,冰冻集合不可更改。
in---判断元素是否在集合中,在返回True,不在返回False
not in---判断元素是否不在结合中,在返回False,不在返回True
len(set)---返回集合set中的元素数量。
set.add(elem)---将元素 elem 添加到集合中。返回值为None
set.update(*others)---更新集合,添加来自others中的所有元素。返回值为None
set.pop()---从集合中移除并返回任意一个元素。如果集合为空则会引发KeyError。
set.remove(elem)---从集合中移除元素elem。如果elem不存在于集合中则会引发KeyError。返回值为None
set.discard(elem)---如果元素elem存在于集合中则将其移除。所删元素不存在不会引发异常。返回值为None
set.copy()---返回集合set()的浅拷贝
set.clear()---从集合中移除所有元素。返回值为None
"""
print("集合的定义**************************************************")
setvar = {True,2,3,4,5,'abd',1,(1,2,3),9.99}
print(f"setvar = {setvar}")
setvar1 = set({1,2,3,'x','y',9.99})
print(f"setvar1 = {setvar1}")
setvar2 = set()
print(f"setvar2 = {setvar2}")
listvar = [2,5,'x']
print(f"listvar = {listvar}")
setvar3 = set(listvar)
print(f"setvar3 = {setvar3}")
setvar4 = frozenset(('jasmine','Booooo'))
setvar3.add(setvar4) # 向集合中添加冰冻集合
print(f"setvar3 = {setvar3}")
print("集合的基本操作**************************************************")
print("in and not in**************************************************")
setvar5 = {True,2,'abd',1,(1,2,3),9.99,'Jasmine','Boly'}
print(f"setvar5 = {setvar5}")
print(f"'Jasmine' in setvar5 = {'Jasmine' in setvar5}")
print(f"'Jasmine' not in setvar5 = {'Jasmine' not in setvar5}")
print("len()**************************************************")
print(f"len(setvar5) = {len(setvar5)}")
print("add()**************************************************")
print(f"setvar5.add('Boo') = {setvar5.add('Boo')}")
print(f"setvar5 = {setvar5}")
print("update()**************************************************")
print(f"setvar5.update('Boo') = {setvar5.update('Boo')}")
print(f"setvar5.update('x','y') = {setvar5.update('x','y')}")
print(f"setvar5 = {setvar5}")
print("remove()**************************************************")
# print(f"setvar5.pop() = {setvar5.pop()}")
print(f"setvar5.remove('x') = {setvar5.remove('x')}")
print(f"setvar5 = {setvar5}")
print("discard()**************************************************")
print(f"setvar5.discard('y') = {setvar5.discard('y')}")
print(f"setvar5 = {setvar5}")
print(f"setvar5.discard('y') = {setvar5.discard('y')}")
print(f"setvar5 = {setvar5}")
print("copy()**************************************************")
setvar6 = setvar5.copy()
print(f"setvar6 = {setvar6}")
print("clear()**************************************************")
print(f"setvar5.clear() = {setvar5.clear()}")
print(f"setvar6.clear() = {setvar6.clear()}")
print(f"setvar5 = {setvar5},setvar6 = {setvar6}"
运行结果:
E:\Programs_Way\Python\python.exe D:/Prj/Python/Study_Basic_Grammar/_46set_definition_operation_function.py
集合的定义**************************************************
setvar = {True, 2, 3, 4, 5, 9.99, (1, 2, 3), 'abd'}
setvar1 = {'y', 1, 'x', 2, 3, 9.99}
setvar2 = set()
listvar = [2, 5, 'x']
setvar3 = {'x', 2, 5}
setvar3 = {'x', frozenset({'jasmine', 'Booooo'}), 2, 5}
集合的基本操作**************************************************
in and not in**************************************************
setvar5 = {'Jasmine', True, 2, 'abd', 'Boly', 9.99, (1, 2, 3)}
'Jasmine' in setvar5 = True
'Jasmine' not in setvar5 = False
len()**************************************************
len(setvar5) = 7
add()**************************************************
setvar5.add('Boo') = None
setvar5 = {'Jasmine', True, 2, 'abd', 'Boo', 'Boly', 9.99, (1, 2, 3)}
update()**************************************************
setvar5.update('Boo') = None
setvar5.update('x','y') = None
setvar5 = {True, 2, 'B', 9.99, 'Jasmine', 'Boly', 'abd', 'y', 'x', 'Boo', (1, 2, 3), 'o'}
remove()**************************************************
setvar5.remove('x') = None
setvar5 = {True, 2, 'B', 9.99, 'Jasmine', 'Boly', 'abd', 'y', 'Boo', (1, 2, 3), 'o'}
discard()**************************************************
setvar5.discard('y') = None
setvar5 = {True, 2, 'B', 9.99, 'Jasmine', 'Boly', 'abd', 'Boo', (1, 2, 3), 'o'}
setvar5.discard('y') = None
setvar5 = {True, 2, 'B', 9.99, 'Jasmine', 'Boly', 'abd', 'Boo', (1, 2, 3), 'o'}
copy()**************************************************
setvar6 = {True, 2, 'Boo', 'B', 9.99, (1, 2, 3), 'Jasmine', 'Boly', 'abd', 'o'}
clear()**************************************************
setvar5.clear() = None
setvar6.clear() = None
setvar5 = set(),setvar6 = set()
Process finished with exit code 0
10.2 冰冻集合
code:
# *************************************************************
"""
冰冻集合
定义:frozenset()
特点:冰冻集合一旦定义,不能做任何的修改
冰冻集合只能做逻辑运算
frozenset()本身就是一个强制转换类的函数,可以把其他任何容器类型的数据转为冰冻集合
推导式:和其他推导式类似,
"""
print("冰冻集合定义**************************************************")
setvar = frozenset([1,2,'x','m',0,9])
print(f"setvar = {setvar}")
print("冰冻集合推导式**************************************************")
setvar2 = frozenset([i**2 for i in range(6)])
print(f"setvar2 = {setvar2}")
运行结果:
E:\Programs_Way\Python\python.exe D:/Prj/Python/Study_Basic_Grammar/_47flozenset.py
冰冻集合定义**************************************************
setvar = frozenset({0, 1, 2, 9, 'm', 'x'})
冰冻集合推导式**************************************************
setvar2 = frozenset({0, 1, 4, 9, 16, 25})
Process finished with exit code 0
10.3 集合推导式
code:
# ***************************************************************
"""
集合推导式:
1.普通推导式
2.带有条件表达式的推导式
3.带有循环嵌套的推导式
"""
print("普通推导式**************************************")
setvar1 = {1,2,3,9,8}
print(f"setvar1 = {setvar1}")
setvar = {i**2 for i in setvar1}
print(f"setvar = {setvar}")
print("带有条件表达式的推导式**************************************")
setvar2 = {i**2 for i in setvar1 if i%2==0}
print(f"setvar2 = {setvar2}")
print("带有循环嵌套的推导式**************************************")
setvar3 = {1,2,3}
setvar4 = {4,5,6}
setvar5 = {i+j for i in setvar3 for j in setvar4}
print(f"setvar5 = {setvar5}")
运行结果:
E:\Programs_Way\Python\python.exe D:/Prj/Python/Study_Basic_Grammar/_48set_comprehension.py
普通推导式**************************************
setvar1 = {1, 2, 3, 8, 9}
setvar = {64, 1, 4, 9, 81}
带有条件表达式的推导式**************************************
setvar2 = {64, 4}
带有循环嵌套的推导式**************************************
setvar5 = {5, 6, 7, 8, 9}
Process finished with exit code 0
10.4 集合逻辑运算
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nWCpEpcf-1647948786858)(C:\Users\15495\AppData\Roaming\Typora\typora-user-images\1646623550706.png)]
code:
# *****************************************************
"""
集合逻辑运算:交& 并| 差集- 对称差^
交集:
set.intersection(*others)---set & other & ...返回一个新集合,其中包含原集合以及others指定的所有集合中共有的元素。
set.intersection_update(*others)---set &= other & ...更新集合,只保留其中在所有others中也存在的元素。返回值为None
并集:
set.union(*others)---set | other | ...返回一个新集合,其中包含来自原集合以及others指定的所有集合中的元素。
set.update(*others)---set |= other | ...更新集合,添加来自others中的所有元素。返回值为None
差集:
set.difference(*others)---set - other - ...返回一个新集合,其中包含原集合中在others指定的其他集合中不存在的元素。
set.difference_update(*others)---set -= other | ...更新集合,移除其中也存在于others中的元素。返回值为None
对称差:
set.symmetric_difference(other)---set ^ other,返回一个新集合,其中的元素或属于原集合或属于other指定的其他集合,但不能同时属于两者。
set.symmetric_difference_update(other)---set ^= other更新集合,只保留存在于集合的一方而非共同存在的元素。返回值为None
检测超集和子集:
set.issuperset(other)---set >= other,检测是否other中的每个元素都在集合set之中。
set > other,检测集合是否为 other 的真超集,即 set >= other and set != other。
set.issubset(other)---set <= other,检测是否集合中的每个元素都在other之中。
set < other,检测集合是否为 other 的真子集,即 set <= other and set != other。
两子集不相交:
set.isdisjoint(other)---如果集合中没有与other共有的元素则返回True。当且仅当两个集合的交集为空集合时,两者为不相交集合。
"""
print("交集*************************************")
vars1 = {1,2,3}
vars2 = {3,4,5,6}
print(f"vars1 & vars2 = {vars1 & vars2}")
res = vars1.intersection(vars2)
print(f"vars1.intersection(vars2) = {res}")
res = vars1.intersection_update(vars2)
print(f"vars1.intersection_update(vars2) = {res}")
print(f"vars1 = {vars1}")
print("并集*************************************")
vars1 = {1,2,3}
vars2 = {3,4,5,6}
print(f"vars1 | vars2 = {vars1 | vars2}")
res = vars1.union(vars2)
print(f"vars1.union(vars2) = {res}")
res = vars1.update(vars2)
print(f"vars1.update(vars2) = {res}")
print(f"vars1 = {vars1}")
print("差集*************************************")
vars1 = {1,2,3}
vars2 = {3,4,5,6}
print(f"vars1 - vars2 = {vars1 - vars2}")
print(f"vars2 - vars1 = {vars2 - vars1}")
res = vars1.difference(vars2)
print(f"vars1.difference(vars2) = {res}")
res = vars1.difference_update(vars2)
print(f"vars1.difference_update(vars2) = {res}")
print(f"vars1 = {vars1}")
print("对称差集*************************************")
vars1 = {1,2,3}
vars2 = {3,4,5,6}
print(f"vars1 ^ vars2 = {vars1 ^ vars2}")
res = vars1.symmetric_difference(vars2)
print(f"vars1.symmetric_difference(vars2) = {res}")
res = vars1.symmetric_difference_update(vars2)
print(f"vars1.symmetric_difference_update(vars2) = {res}")
print(f"vars1 = {vars1}")
print("检测超集和子集*************************************")
vars1 = {1,2,3}
vars2 = {1,2,3,4,5,6}
print(f"vars1 = {vars1}")
print(f"vars2 = {vars2}")
print(f"vars2.issuperset(vars1) = {vars2.issuperset(vars1)}")
print(f"vars1.issubset(vars2) = {vars1.issubset(vars2)}")
print("两子集不相交*************************************")
vars1 = {1,2,3}
vars2 = {4,5,6}
print(f"vars1.isdisjoint(vars2) = {vars1.isdisjoint(vars2)}")
运行结果:
E:\Programs_Way\Python\python.exe D:/Prj/Python/Study_Basic_Grammar/_49set_logical_operator.py
交集*************************************
vars1 & vars2 = {3}
vars1.intersection(vars2) = {3}
vars1.intersection_update(vars2) = None
vars1 = {3}
并集*************************************
vars1 | vars2 = {1, 2, 3, 4, 5, 6}
vars1.union(vars2) = {1, 2, 3, 4, 5, 6}
vars1.update(vars2) = None
vars1 = {1, 2, 3, 4, 5, 6}
差集*************************************
vars1 - vars2 = {1, 2}
vars2 - vars1 = {4, 5, 6}
vars1.difference(vars2) = {1, 2}
vars1.difference_update(vars2) = None
vars1 = {1, 2}
对称差集*************************************
vars1 ^ vars2 = {1, 2, 4, 5, 6}
vars1.symmetric_difference(vars2) = {1, 2, 4, 5, 6}
vars1.symmetric_difference_update(vars2) = None
vars1 = {1, 2, 4, 5, 6}
检测超集和子集*************************************
vars1 = {1, 2, 3}
vars2 = {1, 2, 3, 4, 5, 6}
vars2.issuperset(vars1) = True
vars1.issubset(vars2) = True
两子集不相交*************************************
vars1.isdisjoint(vars2) = True
Process finished with exit code 0