首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

12. 数据类型 - 集合详解

Hi, 大家好。我是茶桁

通过最近几节课的内容,我们已经了解到了大部分的容器类数据的特性和应用,今天这一节课是容器类数据的最后一部分。让我们今天来详细了解一下「集合」。

集合是确定的一组无序的数据的组合。注意这一句话中的几个概念:

首先是「确定的」,当前集合中的元素的值是不能重复的。

集合是由多个数据组合的容器类型数据

集合中的数据没有先后顺序

集合的作用大多数时候是为了从成员检测、从无序列中去除重复项。还有就是数学中的集合类计算,例如交集、并集、差集一集对称差集等等。

集合的定义

集合的定义和字典类数据的定义非常像,包含了三种定义方式:

可以直接使用来定义集合

可以使用进行集合的定义和转换

使用集合推导式来完成集合的定义

需要注意:集合中的元素不能重复,集合中存放的数据为:Number, String, Tuple,冰冻集合

冰冻集合

在集合的定义部分,其他数据类型我们都能理解,唯独多出来一个似乎没有见过,也难以理解。

冰冻集合的定义,需要且仅能使用函数来进行定义。故名思义,冰冻集合一旦定义之后,是不能进行修改的,只能做一些集合相关的运算,比如交集,差集等等。

回过头来看冰冻集合的定义函数, 这个函数本身是一个强制转换类的函数,可以把其他任何容器类型的数据转为冰冻集合,然后参与集合运算。

也是可以看到,打印的结果完全没有任何顺序。

冰冻集合当然也可以使用集合推导式:

可以进行拷贝:

当然冰冻集合也可以进行集合的运算,不过这部分我们将在后面讲解集合的时候来学习。暂时我们只是对「冰冻集合」的概念有个了解就可以了。

集合的基本操作和常规函数

以往的几节,我们都是将集合的操作和函数分开来讲,而这次我们放在一起讲。其实也没其他原因,就是因为这部分的内容并没有多少,并且很容易理解。

打印的结果再一次验证了集合无序,除此之外,我们可以看到打印出来的集合比我们进行定义的时候似乎少了,这又是为什么呢?

原来,在集合内布尔类型的数据其实就是0和1, True表示为1, False表示为0,而集合内的值是不能重复的,所以,布尔值和就只能存在一个。

我们来尝试检测一下集合中的值,和其他容器类数据一样,我们可以直接使用:

然后一样,可以使用检测长度:

遍历的方法依然是用

为什么我这次会将数据类型也打印出来呢?是因为我想让大家好好记住这些类型,目前集合就只支持这些数据类型,其他的并不支持放入。比如说列表,是无法进入集合内的:

可以看到报错信息提示,不支持类型:列表。

那我们如何像集合中追加元素呢?可以使用:

可以看到我们在其中追加了一个字符串, 但是我们再一次验证了集合的无序,新加入的字符串并没有和其他数据类型一样新加入的元素放在最末端。

并且我们注意到了,我用来接收了的返回值,返回了一个。

除了追加之外,当然我们也可以对集合进行删除元素的处理:

用删除集合内的元素是随机的,并且,会将删除的元素返回。

如果想指定删除集合中的元素有没有办法呢?其实也有,和都可以做到,但是两者又有些区别,我们接着看代码:

能看到,确实可以删除集合内的指定元素,并给一个返回值。不过当集合内没有此元素的时候,就会报错,提示关键词错误。

那让我们再来看看

和一样,也删除了一个指定元素,并且返回了。不同的是,当我们使用删除一个不存在的元素时,虽然没有删除任何内容,但是也没有报错。

一个个删除太麻烦了,这个集合我就想让它变成一个空集合,好办,用做清空处理呗,和字典一样:

空集合拿到了,可以放入我们喜欢的元素了。依然和字典一致,我们可以使用:

结果中显示,我们更新成功了,新添加了一些元素进入集合。那第二次添加,为什么就只有添加进去了呢?还记得么?集合不能有重复值,就跟字典不能有重复的一样。在字典中使用,遇到相同后面的会被更新,那其实集合也是一样的,只是因为只有一个值,所以更新完不还是这个值么。

在冰冻集合的时候我们用到过一次, 这里我们要单独拿出来说说,因为集合中的元素都是不可变的,包括元组和冰冻集合,所以当前集合的浅拷贝并不存在深拷贝的问题。换句话说,就是不存在在拷贝后,对集合中不可变的二级容器进行操作的问题。

集合是没有方法的。

集合的运算和检测

集合的主要运算有四种,以下将列出这四种以及他们的方法:

交集

并集

差集

对称差集

我们先来看看符号运算:

然后让我们先求交集:

求两个集合并集(求并集的时候会去除重复项)

求两个集合差集

这段代码结果中和的区别在于,是中有,而中没有, 是中有,而中没有。

求两个集合对称差集

看完符号运算,我们可以再来看看函数运算

交集的运算函数为, 那这两个函数又有什么区别呢?

让我们先记住的结果, 和并没有发生变化,而返回值为两个集合相同的内容。然后我们再来看看另外一个函数:

首先我们就能看到,返回值为, 并且发生了变化。也就是说,是将两者的交集重复赋值给到了头部的变量,这里就是,然后返回一个值。

接着我们来看一下并集运算函数:

我们首先看到了返回值,正事两个集合的并集,两个原始集合也没有发生变化。

再来看看

可以很明显看到区别:返回值为,并集的计算结果被复制给了第一个变量,这里是。

再看完并集之后,就轮到差集了, 分别是这两个函数:

返回值为差集的计算结果, 这里是有的而没有的。那不用问,按照一贯的惯例, 一定是将计算结果返回给第一个变量,这回我们换一下,将换成第一个变量试试:

果然就跟料想的一样,最终的计算结果赋值给了。

最后当然就是对称差集函数:

接收了计算结果,成为了一个新集合。

接下来,大家应该能猜到了吧?不过还是要做做实验才知道,万一和自己想的不一样呢。

嗯,这个结果,一点都没有惊喜和意外。

好吧,运算我们学完之后,接着我们要看看集合的检测方法, 一共有三个,记住用法就可以了:

检测是否为超集

检测是否为子集

检测是否不相交

为了更好的说明,我们不能在用之前的集合,这回,我们定义三个集合来看:

接下来从第一个检测开始:

不知道大家在数学里有没有学过「超集」的概念,我们从最后的打印结果可以看出来,是的超集,反过来则不是,并且,也不是的超集。观察三个集合内的元素我们可以得出结论,如果集合是另外一个集合的超集,那么集合内的元素一定在集合中都找得到。

再来检测子集:

从这个结果中我们能看到,子集的概念就和超集完全相反了。

最后就是检测两个集合是否相交了,也就是集合中的元素有没有重复的:

虽然前三个都打印的, 最后一个打印的,但是我们从集合中应该知道,只有和没有相交关系。所以我们可以知道,这个函数其实是检测不相交的。也就是说,返回结果为则证明相交,返回结果为反而是不相交。

结语

至此,随着我们的集合内容讲完,咱们的容器类数据类型就全部讲完了。

咱们下一节开始,咱们要开始行的篇章。下一节内容预告:Python中File文件的操作。

本节课一样就不布置作业了,大家好好的将最近将的容器类数据好好的回顾一下,将基础打扎实。

  • 发表于:
  • 原文链接https://page.om.qq.com/page/OU-Ra6FU97QREAOhQXjaPqiw0
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券