Python集合基础知识

这次出了Python集合部分,集合这部分还是很好理解的,涉及高中的集合论知识。有很多强大的内置函数和方法帮助我们操作集合,当然令我惊喜的是运算符居然也可以操作集合,不愧是Python的强大,笔记的最后涉及了哈希值,哈希值可以帮助我们更深入理解字典和集合,这次依然是代码+注释的形式,正文部分的字都放入注释中,不再多赘述,如有不足,欢迎补充交流~~
'''
    和高中学的一样,集合的元素是互异的,我们可以像创建字典一样创建一个集合,类型是set
'''
x = {"I", "love", "Study"}

#*  也可以考虑使用列表推导式构建一个集合,如:
y = {s for s in "I love Python"}

#*  我们可以将字符串,元组,列表转化为集合,由于互异性,相同的元素会被合并,
#*  我们可以考虑使用set函数,将返回序列转化的集合
#!  对于元组和列表,他们的每个元素都被作为集合中的元素,对于字符串,
#!  并不是整个字符串作为集合的元素,而是将字符串作为一个可迭代对象,迭代其中的每个元素作为集合元素
z = set("I love studing Python")
print(x, y, z)
#!  x[0]是不被允许的,因为集合无序,因此不存在索引下标

#?  高中集合相互有关系,比如谁是谁的子集等等,那么怎么判断一个集合是否在另一个集合内?
#*  可以考虑使用in 和not in关键字,他们作用于两个集合
print("Study" in x)
print("Study" not in y)

#*  集合是一个可迭代对象,其中的每个元素都可以被取出来,只需要一个for循环
for each in x:
    print(each)

#*  集合也有长度,为元素个数,有时候它和原来的序列不一样
s = [1, 1, 2, 3, 5]
print(len(s) == len(set(s)))

#?  如果我们想将一个集合拷贝,怎么做?
#*  没错,copy方法,实现浅拷贝
t = s.copy()
print(t)

#*  下面我们开始涉及一些集合关系的方法函数,这些集合关系判断方法有个需要注意的地方
#*  就是他们的参数可以是一个集合,也可以是一个可迭代对象,当为可迭代对象时,
#*  这些判断方法一般将可迭代对象自动转化为集合

#?  怎么判断两个集合是否没有交集?也就是彼此是独立的
#*  考虑使用isdisjoint方法,它作用于一个集合,以另一个集合作为参数
#*  它判断两个集合中是否有共同元素,如果有,说明不是相互独立,返回False,
#*  反之,返回True
s = set("Python")
print(s.isdisjoint(set("Study")))
print(s.isdisjoint(("Java")))

#?  怎么判断一个集合是另一个集合的子集?这很经典
#*  我们考虑使用issubset方法,它判断前面的集合是否是后面参数里集合的子集,
#*  是则True,不是则False
print(s.issubset(set("I love Python")))

#?  怎么判断一个集合是另一个集合的父集?
#*  考虑issuperset方法
print(s.issuperset("Py"))

#!  下面是一些集合操作函数,他们都有返回值,返回值就是满足要求的集合,
#!  但是他们都有一个共同点,就是它们不改变原有的集合

#?  怎么得到两个集合的并集呢?
#*  考虑union函数,union函数与众不同,可以是一个参数,也可以是两个参数
print(s.union({1, 2, 3}))
print(s.union({1, 2, 3}, "I love"))

#?  有一个集合A和另一个集合B,对于A,其中和B元素不同的元素构成一个集合,称为A相对于B的差集
#?  那么怎么得到A相对于B的差集呢?
#*  考虑使用difference函数
print(s.difference("Py"))

#?  我们不是想得到A相对于B的差集,而是想将A和B中相同的元素删除,得到一个新的集合呢?
#*  这就是A和B的对称差集,考虑使用symmetric_difference函数
print(s.symmetric_difference("Study"))

#?  我们怎么得到多个集合的交集呢?
#*  考虑intersection函数,参数有多个,对应多个集合
print(s.intersection("Php", "Study"))

#!  运算符在集合中发挥了很重要的作用,它们同样可以实现上面的效果
s = set("Python")
print(s <= set("Python"))   #TODO   子集
print(s < set("Py"))    #TODO   真子集
print(s > set("Python"))    
print(s >= set("Python"))
print(s | {1, 2, 3} | set("Study")) #TODO   求并集
print(s & set("Php") & set("Study"))    #TODO   求交集
print(s - set("Php") - set("Study"))    #TODO   求相对于s的差集,支持多个集合
print(s ^ set("Study")) #TODO   求对称差集
#!  s <= "Study"是不被允许的

#!  一般的集合set是一个可变容器,而集合类型frozenset是一个不可变容器,里面的元素不可以被改变
#*  可以使用frozenset函数将可迭代对象:字符串,元组,列表,转化为不可变集合
t = frozenset("Study")
print(t)

#?  既然集合set类型是一个可变容器,如何给集合增加元素?
#*  考虑update方法,它将集合set就地改造成新的集合
#! 值得注意的是,它没有返回值
s = set("Python")
s.update([1, 1], "Study")
print(s)
#*  另外,update方法实质也是求并集的过程,以上面为例子,它将[1, 1]和"Study"并入s中

#*  如此而来,下面的方法就是将集合就地改造了
#TODO   intersection_update:得到交集, difference_update:得到相对差集,
#TODO   symmetric_difference_update:得到对称差集
s = set("Python")
s.intersection_update("Php", "Pop")
print(s)
s = set("Python")
s.difference_update("Php", "Study")
print(s)
s = set("Python")
s.symmetric_difference_update("Study")
print(s)

#?  不是想求并集,而是单纯想将某个元素插入
#*  考虑add方法
#!  如果参数是字符串,那么它将字符串整体作为元素,
#!  而不是将字符串中的字符一个个取出来,这和之前的update有所不同
s = set("Python")
s.add("45")
print(s)

#?  想删除集合中指定的元素?
#*  使用remove方法
s = set("Python")
s.remove("P")   #!  参数只有一个
print(s)

#!  可是如果没有这个元素,remove会报异常,想要不报出异常,怎么做?
#*  考虑discard方法
s.discard("S")
print(s)
#*  没有反应

#?  怎么删除集合中的元素呢
#*  我们来考虑一下pop方法,它将集合就地删除一个随机的元素,
#*  为什么是随机,这是因为集合是无序的
#!  值得注意的是,pop方法可以返回一个值,即为被删除的元素
s.pop()
print(s.pop())

#?  如果想删除整个集合中的元素,怎么做?
#*  考虑clear方法,它没有返回值
s.clear()
print(s)

#*  python对于不可变的对象,赋予其一个属性,称为哈希值,如果一个对象是不可变的,
#*  我们说这个对象是可哈希的,它有一个固定的哈希值,比如说字符串,数值,元组
#*  如果说这个对象是可变的,那么这个对象是不可哈希的,它没有哈希值
#*  不可变对象里面的内容是固定的,如果有另一个不可变对象的内容与之相同,那么他们的哈希值是一样的
#TODO   我们可以使用hash函数得到对象的哈希值,如果对象不可变,则抛出异常
print(hash(1), hash(1.0), hash(1.001))
print(hash("Study"), hash((1, 2, 3)))
#!  print(hash([1, 2, 3]))抛出异常

#*  这通常没有什么用,但是可以帮助我们深入理解字典和集合的一些本质
#*  对于字典,它要求键必须唯一,不能有两个相同的键,而且键必须可哈希,也就是说
#*  我们不能让一个键是一个列表
#*  对于集合,我们要求集合每个元素必须是可哈希的,也就是说,集合的元素不能是列表,
#?  那集合的元素能不能是集合呢?
#*  一般来说是不行的,因为集合的元素必须可哈希,对于set类型的集合当然不行,
#*  但是对于frozenset类型的集合当然是可以的
s = set("Python")
#!  s.add([1, 2, 3])会异常,因为不能将一个列表作为集合元素
#!  s.add(set([1, 2, 3]))也是这样,因为不能将一个set集合作为集合元素
s.add(frozenset([1, 2, 3]))
print(s)
希望我的笔记可以帮助到你,祝你学习快乐~~
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值