python集合的两种类型_python 入门之 – 集合类型(十九)

在python中,集合是一个无序的,不重复的数据组合,他的主要工作如下:

1、去重,把一个列表变成集合,就自动去重了

2、关系测试,测试两组数据之间的交集、差集、并集等关系

我来举个例子,前两个月出了iPhoneXS,去年出了iPhoneX,我现在想知道有多少人不仅去年买了iPhoneX今年也买了iPhoneXS,如下两个数组:

iPhoneX = ['张三','李四','王五','赵六']

iPhoneXS = ['刘一','李四','周八','郑十','张三']

我要得出两部手机都买了的人按照之前学过的来做的话,肯定要两部循环,如:

iPhoneX = ['张三','李四','王五','赵六']

iPhoneXS = ['刘一','李四','周八','郑十','张三']

user = list()

for i in iPhoneX:

if i in iPhoneXS:

user.append(i)

print(user)

输出结果为:['张三', '李四']

如果再更改需求,我需要把买过 iPhoneXS 和 iPhoneX 的人合并在一起,并且去除重复购买的人该怎么做呢,如果按照之前学过的几种基本类型来做的话,我首先要再建立一个 数组,并且把买过 iPhoneX 和 iPhoneXS 的人拼接到一个数组中,然后根据已经得到的 user 循环判断,删除和 user 重复的所有数据,然后再把 user 拼接进去就得到了我想要的数据,思路是这样没错,可是 python 还是嫌它太麻烦了,所以就有了一个 集合类型,来看看集合是怎么操作的:

首先语法和 字典 一样都是{}号包裹着的,和字典不同的是,在字典里面是有key和value值的,而集合是没有key的,他直接就是value值,如:

a = {1,2,3,4,5,6}

注意,如果集合内部没有一个值,他默认是字典类型,我来做个测试判断,如:

a = {1,2,3,4,5,6}

type(a)

>> #集合类型

a = {}

print(type(a))

>> #字典类型

集合中的内部元素有三个特性:

1、确定性(元素必须可 hash)

2、互异性(去重复)

3、无序性(集合中的元素没有先后之分)

先看看它去重复的功能,还是用最上方的例子来解释

iPhoneX = ['张三','李四','王五','赵六']

iPhoneXS = ['刘一','李四','周八','郑十','张三']

arr = iPhoneX+iPhoneXS

print(set(arr))

>> {'赵六', '王五', '郑十', '李四', '周八', '刘一', '张三'}

可以看到我直接用他的类型set()方法,就直接将一个数组去重并且转成集合类型,同样的我用数组的方法list再把它转成数组就直接ok了:

iPhoneX = ['张三','李四','王五','赵六']

iPhoneXS = ['刘一','李四','周八','郑十','张三']

arr = iPhoneX+iPhoneXS

print(list(set(arr)))

>> ['刘一', '赵六', '李四', '周八', '王五', '郑十', '张三']

这就是集合的强大之处,一个简单的操作完成了很多复杂的逻辑化处理,关于集合的基本操作方法确实还有很多,下面我来一一演示

add(需要增加的内容): 增加 (注意:这里只能添加一个值,如果添加多个值会报错)

update(): 增加(增加多个值,如果重复了会被自动剔除,注意:这里的添加必须写如一个数组)

pop(): 随机删除(注意:这里的可能在数据不多的情况下可能是删除第一个或者最后一个,但是只要数据量足够大,它一定是随机删除的)

remove(参数): 指定删除(通过传递参数指定删除某一个元素,注意:如果指定的元素不存在,则会报错)

discard(参数): 指定删除(通过传递参数指定删除某一个元素,和remove()方法相反的是如果不存在,并不会报错)

clear(): 清空整个集合

add():

a = {1,2,3,4,5}

a.add(6)

print(a)

>> {1,2,3,4,5,6}

a.add(2)

print(a)

>> {1,2,3,4,5,6} #已经存在的值是增加不进去的,集合的特性就是不重复

update():

a = {1,2,3,4,5}

a.update([4,5,6,7,8,9,0]) # 在 update 方法里面添加集合必须以数组的方式加进去

print(a)

>> {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}

pop():

a = {1,2,3,4,5,6,7,8,9,0}

a.pop()

print(a)

>> set({1, 2, 3, 4, 5, 6, 7, 8, 9})

remove():

a = {1,2,3,4,5,6,7,8,9,0}

a.remove(5)

print(a)

>> set({1, 2, 3, 4, 6, 7, 8, 9, 0}) #删除完成后变量 a 已经没有 5 这个变量值了

a.remove(5) #删除没有的元素在控制台会报以下错误

>> Traceback (most recent call last):

File "", line 1, in

KeyError: 5

discard():

a = {1,2,3,4,5,6,7,8,9,0}

a.discard(5)

print(a)

>> set({1, 2, 3, 4, 6, 7, 8, 9, 0}) #删除完成后变量 a 已经没有 5 这个变量值了

a.discard(5) #控制台并不会报错

>>

clear():

a = {1,2,3,4,5,6,7,8,9,0}

a.clear()

print(a)

>> set() # 空集合

好了基本的集合类方法已经讲解完毕了,其实上面说了这么多都是关于集合去重复的一些常规的增删改查,其实集合还有一个关键的重点,那就是关系测试。

关系测试

关系测试分为交集、差集、并集这么几种,可能很多朋友对这几个关键词比较迷惑,其实啊,在我看到交集、差集、并集这三种名称的时候同样的迷惑,先来了解以下这三种分别代表什么意思,在来说说集合能怎么处理这几种关系测试。

交集:

如上方例子,再看下方示意图,就是又买了iPhoneX也买了iPhoneXS的人,这样类型的数据就是交集。

intersection(): 查找交集数据或这直接简写成&

intersection()

iPhoneX = ['张三','李四','王五','赵六']

iPhoneXS = ['刘一','李四','周八','郑十','张三']

a = set(iPhoneX).intersection(set(iPhoneXS))

print(a)

>> {'张三', '李四'}

intersection()简写&

iPhoneX = {'张三','李四','王五','赵六'}

iPhoneXS = {'刘一','李四','周八','郑十','张三'}

print(iPhoneX & iPhoneXS)

>> {'张三', '李四'}

差集:

我们已经知道了怎么获取交集,什么又是差集呢,差集就是非交集的都算是差集,看到下图,我现在能获取到iPhoneX和iPhoneXS都买了的人但是我现在要获取只买了iPhoneX和iPhoneXS的人,那么这种只买了iPhoneX和iPhoneXS的人就是差集,如下图:

difference(): 查找差集数据或这直接简写成-

difference()

iPhoneX = {'张三','李四','王五','赵六'}

iPhoneXS = {'刘一','李四','周八','郑十','张三'}

#查找只购买了 iPhoneX 的人

a = iPhoneX.difference(iPhoneXS)

print(a)

>> {'赵六', '王五'}

difference()简写–

iPhoneX = {'张三','李四','王五','赵六'}

iPhoneXS = {'刘一','李四','周八','郑十','张三'}

#查找只购买了 iPhoneX 的人

a = iPhoneX - iPhoneXS

print(a)

>> {'王五', '赵六'}

并集:

并集其实很好理解,就是两个集合全部相加在一起,然后去除重复的内容就叫并集

union(): 将两个集合转换成一个集合,并且去除重复的内容可以简写成|

union()

iPhoneX = {'张三','李四','王五','赵六'}

iPhoneXS = {'刘一','李四','周八','郑十','张三'}

a = iPhoneX.union(iPhoneXS)

print(a)

>> {'张三', '赵六', '郑十', '周八', '刘一', '王五', '李四'}

union()简写成|

iPhoneX = {'张三','李四','王五','赵六'}

iPhoneXS = {'刘一','李四','周八','郑十','张三'}

a = iPhoneX | iPhoneXS

print(a)

>> {'张三', '赵六', '郑十', '周八', '刘一', '王五', '李四'}

好了集合类型一共就是上方三种,可以算基本上完了,但是差集还有一个小知识点,那就是对称差集

对称差集

对称差集又是什么呢?用上方的例子来说就是只取买了 iPhoneX 和 iPhoneXS 如果都买了就会被过滤掉,如果用上方的讲过的几个知识点来做的话,可能需要这样做:

iPhoneX = {'张三','李四','王五','赵六'}

iPhoneXS = {'刘一','李四','周八','郑十','张三'}

a = iPhoneX - iPhoneXS #iPhoneX 的差集

b = list(iPhoneXS - iPhoneX) #iPhoneXS 的差集并且转成数组

a.update(b) 将数组 b 添加进集合 a 里

print(a)

>> {'王五', '郑十', '周八', '刘一', '赵六'}

可以看到根据上方所学可以这样就求出了只买了iPhoneX和iPhoneXS的人,直接过滤了两者都买了的人。

其实上方代码已经很简洁了,可是python还是嫌弃他比较繁琐,所以又提供了一个内置的方法:symmetric_difference()

symmetric_difference(): 求出对称差集,可以简写成^

symmetric_difference()

iPhoneX = {'张三','李四','王五','赵六'}

iPhoneXS = {'刘一','李四','周八','郑十','张三'}

a = iPhoneX.symmetric_difference(iPhoneXS)

print(a)

>> {'周八', '郑十', '王五', '赵六', '刘一'}

symmetric_difference() 简写方案^

iPhoneX = {'张三','李四','王五','赵六'}

iPhoneXS = {'刘一','李四','周八','郑十','张三'}

a = iPhoneX ^ iPhoneXS

print(a)

>> {'郑十', '赵六', '王五', '刘一', '周八'}

可以看到,对称差集就求出来了,接下来继续往下看看集合的对应关系。

集合的对应关系

什么是集合的对应关系呢?举个最简单的例子:

一个城市的多级联动,省级以下是市级的单位,市级以上是省级,那么在python里面省级就是市级的超集,市级就是省级的子集

这个时候我有一份省级的人物名单和好几份市级的人名单,如:

Province = {'a','b','c','d','e','f','g'} #省级

city1 = {'w','e'} #城市一

city2 = {'f','e'} #城市二

city3 = {'j','k'} #城市三

city4 = {'z','k'} #城市四

city5 = {'a','h'} #城市五

我需要判断这些市级有那些是属于这个省级的子集那么该怎么做呢?python也为我们提供了可以判断层级关系的内置方法:

issubset(): 判断一个集合内的所有元素是否被包含在另一个集合内 (简写方式为<=)

issuperset(): 判断一个集合内的元素是否包含了另一个集合的所有元素(和上方相反简写方式为>=)

根据这个城市的小例子,上方数据不是很多,一眼就可以看到只有城市二的所有元素,是省级单位都包括了的,所以其他的城市我就不测试了,直接用城市二来测试,如:

Province = {'a','b','c','d','e','f','g'} #省级单位

city2 = {'f','e'} #城市二

a = Province.issuperset(city2) #判断省份里面是否包含了 市级

b = city2.issubset(Province) #判断市级是否被包含在省级内

print(a)

print(b)

>> True

>> True

简写方式:

Province = {'a','b','c','d','e','f','g'} #省级单位

city2 = {'f','e'} #城市二

a = Province >= city2 #判断省份里面是否包含了 市级

b = city2 <= Province #判断市级是否被包含在省级内

print(a)

print(b)

>> True

>> True

python还为我们提供了一个方法用来判断两个集合是不是不相交的。

isdisjoint(): 用来判断两个集合是不是不相交的,如果相交,返回 False, 如果不相交,返回True

isdisjoint()

city2 = {'f','e'}

a = city2.isdisjoint(city2) #city2和它自身是相交的,所以返回的是 false ,只有不相交才会返回 true

print(a)

>> False

好了,还有最后两个内置方法:

difference_update() : 差集赋值

intersection_update() : 交集赋值

difference_update()

a = {1,2,3,4,5,6,7,8,9,0}

b = {1,2,3,4,5,6,7}

a.difference_update(b) #将取到的差集赋值给 a 改变了 a 原有的值

print(a)

>> {0, 8, 9}

intersection_update()

a = {1,2,3,4,5,6,7,8,9,0}

b = {1,2,3,4,5,6,7}

a.intersection_update(b) #将取到的交集赋值给 a 改变了 a 原有的值

print(a)

好了关于集合类型基本上全部完了,加上前面的几个章节基本上关于python的所有基本类型就彻底学完了要学习关于python新的知识了,你准备好了吗?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/396668.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机数值计算的相关文章,数值计算论文.doc

数值计算论文PAGE \* MERGEFORMAT 13高斯消去法在电路分析中的应用—利用计算机求解一些复杂电路的参数雷嘉豪电子信息工程学院自动化一班100401102摘 要求解线性代数方程组的数值方法有很多&#xff0c;但归纳起来&#xff0c;可分为两类&#xff1a;一种是直接法&#xff0c;…

bzoj 2756奇怪的游戏

2756: [SCOI2012]奇怪的游戏 Time Limit: 40 Sec Memory Limit: 128 MBSubmit: 2571 Solved: 685[Submit][Status][Discuss]Description Blinker最近喜欢上一个奇怪的游戏。 这个游戏在一个 N*M 的棋盘上玩&#xff0c;每个格子有一个数。每次 Blinker 会选择两个相邻的格子&…

秒懂,Java 注解 (Annotation)你可以这样学

转自: https://blog.csdn.net/briblue/article/details/73824058 文章开头先引入一处图片。 这处图片引自老罗的博客。为了避免不必要的麻烦&#xff0c;首先声明我个人比较尊敬老罗的。至于为什么放这张图&#xff0c;自然是为本篇博文服务&#xff0c;接下来我自会说明。好了…

Java技术中的三大特性

为什么80%的码农都做不了架构师&#xff1f;>>> 1&#xff0e;虚拟机 Java虚拟机JVM&#xff08;Java Virtual Machine&#xff09;在Java编程里面具有非常重要的地位&#xff0c;约相当…

matlab图像增强分段线性函数_图像增强、锐化,利用 PythonOpenCV 来实现 4 种方法!...

图像增强目的使得模糊图片变得更加清晰、图片模糊的原因是因为像素灰度差值变化不大&#xff0c;图片各区域产生视觉效果似乎都是一样的&#xff0c; 没有较为突出的地方&#xff0c;看起来不清晰的感觉解决这个问题的最直接简单办法&#xff0c;放大像素灰度值差值、使图像中的…

python多人聊天室_Python基于Socket实现简易多人聊天室

前言套接字(Sockets)是双向通信信道的端点。 套接字可以在一个进程内&#xff0c;在同一机器上的进程之间&#xff0c;或者在不同主机的进程之间进行通信&#xff0c;主机可以是任何一台有连接互联网的机器。套接字可以通过多种不同的通道类型实现&#xff1a;Unix域套接字&…

计算机考研保护一志愿,考研良心大学,保护一志愿的考研名校!

大家好&#xff0c;我是&#xff0c;今天胖胖要跟大家送一些重要的干货&#xff0c;就是对于选学校的小伙伴来说也好&#xff0c;或者是即将要参加研究生复试的小伙伴们来好胖胖在这里要跟大家说一个关于考研白名单的事情&#xff0c;因为大家都知道考研是会分黑名单和白名单&a…

python变量输出到文件_使用函数将多个变量写入文件

首先&#xff0c;要获得当前正在执行的脚本名&#xff0c;或者更确切地说是调用函数的模块&#xff0c;必须从堆栈跟踪中获取它。globals()-它将在writeToValues()函数的相同上下文中执行&#xff0c;因此它不会从“调用者”接收globals()。要纠正这种情况&#xff0c;您可以使…

嵌入式linux系统移植的四大步骤_嵌入式系统移植步骤

在嵌入式系统移植中重要的一部分是操作系统的移植&#xff0c;与其它操作系统相比&#xff0c;Linux大的特点&#xff1a;它是一款遵循GPL的操作系统&#xff0c;我们可以自由地使用、修改、和扩展它。正是由于这一特色&#xff0c;嵌入式系统移植过程中Linux系统受到越来越多人…

sdn框架的计算机网络管理,清华SDN实践--SDN 系统架构与数据中心应用

清华大学在SDN 的系统架构以及其在数据中心网络中的应用方面展开了深入研究&#xff0c;主要研究成果包括&#xff1a;1. 以数据为中心的软件定义网络架构 SODA(Software Defined Data Centric Networking)。与 OpenFlow 相比&#xff0c;SODA 大大增强了数据层面的处理能力&am…

《软件工程》课之-调查问卷的心得体会

1.这次调查是艰辛的。 2.很多人都误以为我在发小广告。。 3.很多人都不认识俄罗斯方块1010这个游戏。 4.大家对于游戏的见解千奇百怪。 5.题目出的不是很完美&#xff0c;下次改进。。 6.简单分析下结果&#xff0c;男孩子都喜欢多人的游戏&#xff0c;女孩的喜欢的多种多样&am…

python循环语句for求和_for循环简介

## for循环简介for循环可以用来遍历某一对象(遍历&#xff1a;通俗点说&#xff0c;就是把这个循环中的第一个元素到最后一个元素依次访问一次)。for循环的基本结构如下&#xff1a;![](https://img.kancloud.cn/75/33/753371a9536ed9eeb159074482ec85f0_558x174.png)说明&…

华为备份历史版本_华为手机NAS备份时提示“需处于同一局域网”的解决方法

本内容来源于什么值得买APP&#xff0c;观点仅代表作者本人 &#xff5c;作者&#xff1a;噩梦飘雷创作立场声明&#xff1a;在使用华为手机向群晖NAS中备份时发现一直无法成功&#xff0c;经过一番研究找到了解决方案&#xff0c;希望能帮到大家~前言最近看了一位老哥的帖子&a…

计算机系统集成难点,企业MES实施中存在的难点及建议

MES是企业生产管理服务的核心信息化系统。实施MES是为了将现代企业生产管理思想、理念引入企业生产管理&#xff0c;对企业生产管理流程进行重组和优化&#xff0c;促进企业生产管理水平的提高。可是作用如此大的MES系统在实施过程中能一路无阻吗&#xff1f;MES系统的作用1.车…

【原创】自己编写的JavaGUI一键生成(hibernate/spring/mvc/maven)工具(附带视频教程源码)...

为什么80%的码农都做不了架构师&#xff1f;>>> 带项目源码&#xff08;https://git.oschina.net/qsyan/GeneratorFx&#xff09; app下载地址(附带视频教程)&#xff1a;http://download.csdn.net/detail/juyan2008/9769406 注明&#xff1a;此应用采用javafx编写…

2018-2019 20165203 《信息安全系统设计基础》第一周学习总结

2018-2019-1 20165203 《信息安全系统设计基础》第一周学习总结 教材学习内容总结 编译&#xff1a;gcc [选项] [文件名]选项参数表 参数对应功能-E仅执行编译预处理-S将.c代码转换为汇编语言代码-c仅执行编译操作&#xff0c;不进行连接操作-o指定生成的输出文件-I (大写)指定…

普通计算机怎么算根号_大学专业介绍 | 计算机专业的真实就业情况

前两天给大家简单介绍了近些年比较火的计算机类相关专业具体都有哪些不同&#xff0c;以及就业时的行业或者岗位的侧重点。今天呢我们继续这个话题&#xff0c;来聊一聊整个计算机相关专业在学习和就业过程中大概是什么样子的&#xff0c;希望能够给大家提供一些实实在在的参考…

设计模式总结篇系列:工厂方法模式(Factory Method)

工厂方法模式适合于对实现了同一接口或继承了同一父类的一些类进行实例的创建。一般是通过定义一个工厂类&#xff0c;并在其方法中实现对具有上述特点的类对象的创建。 根据具体产生类对象的方法定义形式&#xff0c;又可以将其分为普通工厂方法模式、多个工厂方法模式和静态工…

高新园区到大连计算机学校,大连高新区中心小学

大连市高新区中心小学简介&#xff1a;大连市高新区中心小学始建于2009年9月&#xff0c;是大连高新技术产业园区筹建的第一所直属公办学校。学校现拥有2000多名学生&#xff0c;87名教职员工。学校确定了“办诗韵教育&#xff0c;让每个孩子都幸福的教育理念”&#xff0c;通过…

java基础之匿名内部类

内部类:   概述: 类里边还有一个类, 里边那个类叫内部类, 外边那个类叫外部类.   分类:  成员内部类: 定义在成员位置的内部类.  局部内部类: 定义在局部位置的内部类. 格式:   new 类名或者接口名(){     //重写类或者接口中 所有的 抽象方法;   };本质:  就…