"""
集合的使用
与数学上是一致的,不允许有重复的元素,而且可以进行交集,并集,差集等运算
"""
# 创建集合
set1 = {1, 2, 3, 4, 3, 2, 1}
print(set1) # {1, 2, 3, 4} 自动去除重复元素
# 求长度
print('集合长度为', len(set1)) # 集合长度为 4
# 列表转集合
set2 = set(range(1, 10))
print(set2) # {1, 2, 3, 4, 5, 6, 7, 8, 9}
# 集合添加元素(若重复便不会添加)
set1.add(4)
print(set1) # {1, 2, 3, 4}
set1.add(5)
print(set1) # {1, 2, 3, 4, 5}
# 集合添加元素
set2.update([11, 12])
print(set2) # {1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12}
# 删除元素
set2.discard(5)
print(set2) # {1, 2, 3, 4, 6, 7, 8, 9, 11, 12}
# set2.remove(5)
# print(set2) # KeyError: 5 remove的元素不存在会引发
# 所以要先判断后删除...
if 4 in set2:
set2.remove(4)
print(set2) # {1, 2, 3, 6, 7, 8, 9, 11, 12}
# 遍历集合中的元素
for i in set2:
print(i, end=' ') # 1 2 3 6 7 8 9 11 12
print()
# 将元组转换为集合
set3 = set((1, 3, 5, 7, 4, 2))
print(set3) # {1, 2, 3, 4, 5, 7}
# 删除元素
print(set3.pop()) # 1
print(set3) # {2, 3, 4, 5, 7}
'''
集合的交集、并集、差集、对称差运算
交集
intersection
英 [ˌɪntəˈsekʃn] 美 [ˌɪntərˈsekʃn]
n.
十字路口;交叉路口;交点;横断;交叉;相交
并集
union
英 [ˈjuːniən] 美 [ˈjuːniən]
n.
协会;联合会;会社;俱乐部;同盟;联盟;联邦;(尤指内战时期的)美利坚合众国,美国
差集
difference
英 [ˈdɪfrəns] 美 [ˈdɪfrəns]
n.
差别;差异;不同(之处);变化(之处);差;差额;意见分歧;不和
vt.
辨别;区分
对称差分
symmetric_difference
'''
print('列表1', set1) # {1, 2, 3, 4, 5}
print('列表2', set2) # {1, 2, 3, 6, 7, 8, 9, 11, 12}
# 交集
print(set1 & set2) # {1, 2, 3}
print(set1.intersection(set2)) # {1, 2, 3}
# 并集
print(set1 | set2) # {1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12}
print(set1.union(set2)) # {1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12}
# 差集
print(set1 - set2) # {4, 5}
print(set1.difference(set2)) # {4, 5}
# 对称差集 除去set1和set2的差集两个列表所有的元素
print(set1 ^ set2) # {4, 5, 6, 7, 8, 9, 11, 12}
print(set1.symmetric_difference(set2)) # {4, 5, 6, 7, 8, 9, 11, 12}
'''
判断子集和超集
子集
subset
超集
superset
'''
# 是否为子集
print(set2 <= set1) # False
print(set2.issubset(set1)) # False
'''是否为超集
如果一个集合S2中的每一个元素都在集合S1中,
且集合S1中可能包含S2中没有的元素,
则集合S1就是S2的一个超集,
反过来,S2是S1的子集。
S1是S2的超集,若S1中一定有S2中没有的元素,
则S1是S2的真超集,反过来S2是S1的真子集。
'''
print(set1 >= set2) # False
print(set1.issuperset(set2)) # False