Python“六君子”之Set

,谢谢大家的关注,今天我们来探索一下Python“六君子”之Set,即集合。我们大家对集合并不陌生,比如:超级女生、快乐男生、学校里的学生、菜市场的蔬菜、工厂里的职工、周杰伦一年的演唱会、每场演唱会的歌迷等都是生活中集合的体现。插一句,文章封面“黑子的篮球”帝光中学篮球队“奇迹的时代”也是一个很赞的集合。那么集合是什么呢?百度百科中给了这样一个解释,集合是指具有某种特定性质的具体的或抽象的对象汇总成的集体,这些对象称为该集合的元素。例如全中国人的集合,它的元素就是每一个中国人。我们通常用大写字母如A,B,S,T,...表示集合,而用小写字母如a,b,x,y,...表示集合的元素。若x是集合S的元素,则称x属于S,记为x∈S。若y不是集合S的元素,则称y不属于S,记为y∉S。一般的我们把含有有限个元素的集合叫做有限集,含无限个元素的集合叫做无限集。

了解完基本概念后,让我们看看集合在Python3中是什么样子的。在Python3中,集合是写在大括号{ }之间,用逗号分割开的无序不重复序列。需要注意的是集合的两个特性:无序不重复,这跟我们之前学过的数据类型有很大不同,,说了这么多,大家都饿了吧,服务员,上代码。

如上图所示,我们定义了一个水果的集合fruit,看大家比较饿了,苏苏还特意多加了一个'apple'和'orange',不过这显然是徒劳的,因为集合中不允许有重复元素;同样由于集合是无序的,所以通过fruit[0]语句获取集合的第一个元素也不行。,验证了集合的两大特性,还记得集合有哪些操作吗?交集、并集、差集、异或、包含与被包含等等,那么相对应的,大家还记得怎么在Python中查看一个类型的内置方法吗?是help()函数,对!

接下来,我们就一起分析一下Python中Set所特有的方法,首先是求交集。

求交集采用的是__add__和__iadd__方法,之前笔者在《Python“六君子”之List》中提到过__add__和__iadd__方法的区别,在此就不重复了,需要大家注意的是set内置__iadd__方法,也就说明了set是可变数据类型。

,为了节约空间,苏苏将并集、差集、异或放到同一张图里表示。

set还有一些非常有趣的操作,我们继续看。

clear()用于删除集合中的所有元素。

discard()和remove()均用于删除集合中的某个元素,区别是当该元素不存在时,discard()函数do nothing,而remove()函数会引发异常;pop()函数移除集合中的任意元素,并将该元素返回,当集合为空时会引发异常。

ok,讲了这么多,居然误了一个重要知识点,子集sub set和超集super set,Python3中有相应的方法判断一个集合是否是另一个集合的子集或超集。

另外,不知道大家还记得否,列表的元素可以是列表,那么集合的元素可以是集合或列表吗?大家先试试?待会儿我再给出解释。

什么情况呢?集合的元素可以是字符串、数字或元祖,却不可以是列表或集合,并且报出了相同的错误TypeError:unhashable type,查阅文档发现,str、int、tuple都有__hash__这个方法,而list和set却没有,继续探寻,找到了答案,官方文档上有这样一句话:An object is hashable if it has a hash value which never changes during its lifetime,什么意思呢?如果一个对象在其生命周期的哈希值都是不变的,则该对象是可哈希的。因此,在Python3中所有内置的不可变对象都是hashable,而可变对象是unhashable。列表和集合都是可变类型,所以无法作为集合的元素。其实这也好理解,在我们平时生活中,一个集合就是一个集体或组织,如果一个元素可以变的和刚加入集合时不一样,岂不是很危险的事情。人类世界或许这种情况还真的存在,但计算机的世界是程序员的圣地,当然不允许这种不合规矩的情况出现了,,扯远了。

回到本次讲解,今天真是干货满满啊,希望初学者可以把上面的代码都自己敲一遍以加深印象。OK,又到说再见的时候了,苏苏要为铁粉们准备接下来的编程大宴去了,敬请大家享用。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180605G09BFI00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券