# 集合 Python除了List、Tuple、Dict等常用数据类型外,还有一种数据类型叫做集合(set),
# 集合的最大特点是:集合里边的元素是不可重复的并且集合内的元素还是无序的,所以一般情况下集合常用的两个场景是:
# 1.去重(如:列表去重);2.关系测试(如:取交集、取并集、取差集等)
# 创建集合 注意:创建一个空集合必须用 set() 而不是 { },因为 { } 是用来创建一个空字典。
# 第一种方法 直接使用{}创建 不推荐
numberset = {1, 2, 5, 3, 3, 4, 5} # 直接使用{}创建元组 # 如果输入了重复的元素,python会自动只保留一个
threeset = {"醉里挑灯看剑", "梦回吹角连营", "八百里分麾下炙", "五十弦翻塞外声", "沙场秋点兵"}
fourset = {"Python", 28, ("人生苦短", "我要用python"), ("爬虫", "云计算", "大数据")}
themeset = {"优雅", "大方", "美丽"}
print(numberset, "\n", threeset, "\n", fourset, "\n", themeset) # python中的set是无序的,所以每次输出时元素的排序可能不同
# 第二种方法 使用set()函数创建 将列表、元组和其他可以迭代的对象转换成集合
# 语法:setname = set(iteratiom) iteratiom:要转换为集合的可迭代对象,包含列表、元组、range对象等,也可以是字符串(返回的集合将是包含全部不重复字符的集合)
set1 = set([1, 2, 3, 4])
# 创建一个字符集合 注意:从输出结果中我们会看到l只出现了一次
set2 = set("Hello,World!")
set3 = set(("人生苦短", "我要用python"))
set4 = set(range(2, 5))
set5 = set() # 空集合
print(set1, set2, set3, set4, set5)
# 向集合中添加和删除元素
# 添加元素 add()方法 set.add(element) element:表示要添加的元素内容(只能使用字符串、数字和布尔类型的数据,不可以使用列表、元组等迭代对象)
set6 = {"醉里挑灯看剑", "梦回吹角连营", "八百里分麾下炙", "五十弦翻塞外声", "沙场秋点兵"}
set6.add("这是刘禹锡的诗句") # add()方法
print(set6)
# 还有copy()方法 直接复制集合
set7 = set6.copy()
print(set7)
# 删除集合元素 四种方法:del pop() remove() clear()
set8 = {"醉里挑灯看剑", "梦回吹角连营", "八百里分麾下炙", "五十弦翻塞外声", "沙场秋点兵"}
set8.remove("醉里挑灯看剑") # s.remove(x) 删除指定元素,将元素x从集合s中移除,如果元素不存在,则会发生错误。
print("remove()方法后:", set8)
obj1 = set8.pop() # 删除一个元素
print("移除的元素是:", obj1, "pop()方法后:", set8)
set8.clear() # clear()方法清空集合
print("clear()方法后:", set8)
del set8 # del语句会删除整个集合
# print("clear()方法后:", set8)
# 计算集合元素个数 语法格式如下:len(s) 计算集合 s 元素个数。
set9 = set(("醉里挑灯看剑", "梦回吹角连营", "八百里分麾下炙", "五十弦翻塞外声", "沙场秋点兵"))
print("集合元素的是个数:", len(set9))
# 判断元素是否在集合中存在 语法格式如下:x in s 判断元素x是否在集合s中,存在返回 True,不存在返回 False。
print("八百里分麾下炙" in set9)
print("小巧你在哪" in set9)
# 集合的交集、并集和差集运算
set1 = set([1, 2, 5, 4, 3, 6])
set2 = set([3, 4, 5, 6, 7, 8])
# 取交集 &
set3 = set1 & set2
set3 = set1.intersection(set2) # 取交集,intersection()与 & 效果相同
print("set1和set2的交集(set1 & srt2)为:", set3)
# 取并集 |
set4 = set1 | set2
# set4 = set1.union(set2) #取并集,union()与 | 效果相同
print("set1和set2的并集(set1 | srt2)为:", set4)
# 取差集
set5 = set1 - set2
# set5 = set1.difference(set2) #取差集 ,difference()与 - 效果相同
print("set1与set2的差集(set1 - srt2)为:", set5)
set6 = set2 - set1
# set6 = set2.difference(set1)
print("set2与set1的差集为:", set6)
# 对称差集 即去掉两个集合的共同的部分
set7 = set1 ^ set2
set7 = set1.symmetric_difference(set2) # 对称差集, symmetric_difference()与 ^ 效果相同
print("set1 ^ set2(去掉两个集合的共同的部分)=", set7)
# 判断是否是set1是否是set2的子集
flag1 = set1.issubset(set2)
print("判断是否是set1是否是set2的子集:", flag1)
# 判断是否是set1是否是set2的父集
flag2 = set1.issuperset(set2)
print("判断是否是set1是否是set2的父集:", flag2)