集合跟我们学的列表有点像,也是可以存一堆数据,不过它有几个独特的特点,令其在整个Python语言中占有一席之地,
- 里面的元素不可变,代表你不能存一个list、dict 在集合里,字符串、数字、元组等不可变类型可以存
- 天生去重,在集合里没办法存重复的元素
- 无序,不像列表一样通过索引来标记在列表中的位置 ,元素是无序的,集合中的元素没有先后之分,如集合{3,4,5}和{3,5,4}算作同一个集合
基于上面的特性,我们可以用集合来干2件事,去重和关系运算
去重
lans = ["Java", "Vue", "Java", "Vue", "Python"]
print("langs去重:", list(set(lans)))
输出
langs去重: ['Java', 'Python', 'Vue']
查询
print("类型:", type(lan))
print("信息:", lan)
print("长度:", len(lan))
print("是否存在Java:", "Java" in lan)
输出
类型: <class 'set'>
信息: {'Java', 'Python', 'Ruby', 'Vue'}
长度: 4
是否存在Java: True
新增
lan.add("Golang")
print("新增一个数值后:", lan)
lan.add(("Netty", "SpringBoot", "ShardingSphere"))
print("新增一个元组后:", lan)
输出
新增一个数值后: {'Java', 'Golang', 'Ruby', 'Python', 'Vue'}
新增一个元组后: {'Java', 'Golang', 'Ruby', 'Python', 'Vue', ('Netty', 'SpringBoot', 'ShardingSphere')}
删除
lan.discard("Vue") # 如果这个值不存在,do nothing.
lan.remove("Java") # 如果这个值不存在,报错
lan.pop() # 随机删除
print("删除三个元素后:", lan)
lan.clear()
print("全部删除:", lan)
输出
删除三个元素后: {'Ruby', 'Python', ('Netty', 'SpringBoot', 'ShardingSphere')}
全部删除: set()
修改(想p吃)
关系运算
print("lan的值:", lan)
print("lans:", set(lans))
print("lan和lans的交集1:", lan.intersection(set(lans)))
print("lan和lans的交集2:", lan & set(lans))
print("lan和lans的并集1:", lan.union(set(lans)))
print("lan和lans的并集2:", lan | set(lans))
print("lan和lans的差集1(lan-langs):", lan.difference(set(lans)))
print("lan和lans的差集1(lans-lan):", set(lans).difference(lan))
print("lan和lans的差集2(lan-langs):", lan - set(lans))
print("lan和lans的差集2(lans-lan):", set(lans) - lan)
print("对称差集1(去掉两个集合中都存在的):", lan.symmetric_difference(set(lans)))
print("对称差集2(去掉两个集合中都存在的):", lan ^ set(lans))
print("lan和lans是否不相交:", lan.isdisjoint(lans))
print("lan是否包含lans:", lan.issuperset(lans))
print("lans是否包含lan:", lan.issubset(lans))
lan.difference_update(set(lans))
print("lan和lans的差集并更新(lan-langs):", lan)
lan.intersection_update(set(lans))
lan.symmetric_difference_update(set(lans))
输出
lan的值: {('Netty', 'SpringBoot', 'ShardingSphere'), 'Python', 'Ruby'}
lans: {'Python', 'Java', 'Vue'}
lan和lans的交集1: {'Python'}
lan和lans的交集2: {'Python'}
lan和lans的并集1: {'Java', 'Vue', 'Python', ('Netty', 'SpringBoot', 'ShardingSphere'), 'Ruby'}
lan和lans的并集2: {'Java', 'Vue', 'Python', ('Netty', 'SpringBoot', 'ShardingSphere'), 'Ruby'}
lan和lans的差集1(lan-langs): {('Netty', 'SpringBoot', 'ShardingSphere'), 'Ruby'}
lan和lans的差集1(lans-lan): {'Vue', 'Java'}
lan和lans的差集2(lan-langs): {('Netty', 'SpringBoot', 'ShardingSphere'), 'Ruby'}
lan和lans的差集2(lans-lan): {'Vue', 'Java'}
对称差集1(去掉两个集合中都存在的): {'Java', 'Vue', 'Ruby', ('Netty', 'SpringBoot', 'ShardingSphere')}
对称差集2(去掉两个集合中都存在的): {'Java', 'Vue', 'Ruby', ('Netty', 'SpringBoot', 'ShardingSphere')}
lan和lans是否相交: False
lan是否包含lans: False
lans是否包含lan: False
lan和lans的差集并更新(lan-langs): {'Golang', ('Netty', 'SpringBoot', 'ShardingSphere'), 'Ruby'}