Python 极简教程(十)集合 set
什么是集合?
集合(set)是一种可变,无序和不重复的序列。
集合是python的序列之一,集合没有列表(list)、元组(tuple)和字典(ditc)常见。但是有时候也有奇效。
我们先来看个集合的例子:
>>> s = {'b', 'x', 'a'}
>>> type(s)
# <class 'set'>
s = {'b', 'x', 'a'}就是一个集合(set),数据类型就是set。
我们可以仔细观察一下集合(set)的形态:
- 以逗号分隔元素,类似列表(list)和元组(tuple);
- 以大括号{}进行约束并且其无序的特性,类似字典(dict);
- 无序的特性,类似字典(dict);
- 不重复,类似字典中的键。
可以简单的理解为就是没有值(value)的字典(dict)。
当然这是我说的,不够准确,被人骂了不要来找我!
接下来我们来看下集合的基本操作。
集合的创建
我们看如何创建集合:
- 创建一个空的集合;
空集合的创建不能用以下这种形式
>>> s = {} # 这是一个空字典,不是空集合
>>> type(s)
# <class 'dict'>
那要如何创建一个空的集合呢?
>>> s = set() # 这是一个空字典,不是空集合
>>> s
# set()
>>> type(s)
# <class 'set'>
我们可以看到要创建一个空集合,要使用
s = set()这种方式。
- 创建非空的集合;
set()可以将任意一种序列变成集合
# 列表
>>> li = ['a', 'b', 'c']
>>> set(li)
# {'b', 'c', 'a'}
# 元组
>>> t = (1,2,3)
>>> set(t)
# {1, 2, 3}
# 字典
>>> d = {'x':1,'y':2}
>>> set(d)
# {'y', 'x'}
# 字符串
>>> set('python')
# {'y', 'p', 'n', 'h', 't', 'o'}
- 利用集合的不重复状态,进行序列的去重
# 有重复元素的列表
>>> li = ['a', 'b', 'c', 'a', 'c']
>>> s = set(li)
# {'b', 'c', 'a'}
# 如果想去重后依然是列表,转换一下
>>> li = list(set(li))
>>> li.sort()
>>> li
# ['a', 'b', 'c']
集合元素的添加、删除
- 集合元素的添加有两种常用方法,分别是add和update
add方法类似于列表(list)中的append方法,在末尾添加元素
>>> s = {'b', 'c', 'a'}
>>> s.add('abc') #这里会把'abc'当成一个字符串
>>> s
# {'b', 'c', 'abc', 'a'}
集合中的元素不能是列表(list)、字典(dict)
>>>s = {'b', 'c', 'a'}
>>> s.add([1,2])
TypeError: unhashable type: 'list'
>>> s.add({'x':1,'y':2})
TypeError: unhashable type: 'dict'
update方法类似于列表相加,其中update的参数为序列。也就是把序列中的所有元素全部无序并排重后加入到集合中。
>>> s = {'b', 'c', 'a'}
>>> s.update('xyz') #这里会把'xyz'当成序列来处理,'x','y','z'分别是三个元素
>>> s
# {'y', 'c', 'z', 'b', 'x', 'a'}
- 集合元素的删除方法
集合删除操作方法有两种:
s.remove('e'):删除匹配的元素
s.pop():删除第一个元素,无法指定index,因为集合没有index
# remove
>>> s = {'b', 'c', 'a'}
>>> s.remove('a')
>>> s
# {'b', 'c'}
# pop
>>> s = {'b', 'c', 'a'}
>>> s.pop()
# 'b'
>>> s
# {'c', 'a'}
集合的交集、合集(并集)、差集
通过集合的交集、合集(并集)、差集可以很方便的处理一些列表(list)
- 交集:
交集,符号“&”,表示两个集合中相同的元素部分组成新的集合
# 交集 &
>>> a = set(['a', 'b', 'c'])
>>> b = set(['b','d','e'])
>>> a & b
# {'b'}
- 合集(并集)
合集(并集),符号“|”,表示两个集合组合成一个不重复的新集合(也就是重复部分会进行排重)
# 合集(并集) |
>>> a = set(['a', 'b', 'c'])
>>> b = set(['b','d','e'])
>>> a | b
# {'e', 'd', 'c', 'b', 'a'}
- 差集、相对补集
差集、相对补集, 符号“-”,如果 a - b 表示a集合中没有在b集合中存在的元素,反之 b - a 表示b集合中没有在a集合中存在的元素。可以用于取两个集合中不相同的元素。
# 合集(并集) |
>>> a = set(['a', 'b', 'c'])
>>> b = set(['b','d','e'])
>>> a - b
# {'c', 'a'}
>>> b - a
# {'e', 'd'}
- 其他
除开上面集中集合外,还有类似与列表(list)中的一些操作,如in,not in,!=,==等
# 不等于 !=
>>> a != b
# True
# 等于 ==
>>> a == b
# False
# 包含 in
>>> a in b
# False
# 不包含 not in
>>> a not in b
# True
通过集合,我们可以方便快速的处理各种序列中的一些特殊操作。
- 排重,如果序列中存在重合的元素,可以通过集合方便的去重;
- 取两个序列中相同的元素,通过将序列转换为集合后,取交集即可;
- 将两个序列合并,并且元素不重复,通过合集即可;
- 取两个序列中不相同的部分,用差集即可。
本节练习:
- 将列表 [5, 6, 7, 4, 5, 7] 中重复的元素去掉
- 求列表[2, 3, 5, 7, 9]和[2, 4, 5, 9, 8] 中的相同元素和不同元素
Python 极简教程(十)集合 set的更多相关文章
- Python 极简教程(八)字符串 str
由于字符串过于重要,请认真看完并保证所有代码都至少敲过一遍. 对于字符串,前面在数据类型中已经提到过.但是由于字符串类型太过于常用,Python 中提供了非常多的关于字符串的操作.而我们在实际编码过程 ...
- python极简教程04:进程和线程
测试奇谭,BUG不见. 大家好,我是谭叔. 这一场,主讲python的进程和线程. 目的:掌握初学必须的进程和线程知识. 进程和线程的区别和联系 终于开始加深难度,来到进程和线程的知识点~ 单就这两个 ...
- python极简教程01:基础变量
测试奇谭,BUG不见. 其实很久之前,就有身边的同事或者网友让我分享一些关于python编程语言的教程,他们同大多数自学编程语言的人一样,无外乎遇到以下这些问题: 网络上的资料过多且良莠不全,不知道如 ...
- Python 极简教程(十二)逻辑控制语句 if else
计算机软件之所以能够对不同的情况进行不同的处理,就是我们在编码的时候,通过逻辑控制语句,告诉软件在不同的情况下应该做什么处理. 比如我们在登录的时候,那么当你输入正确的账号密码和错误的账号密码,完全是 ...
- Python 极简教程(一)前言
现在 Python 用处很多,学的人也很多,其流行程度自不必说.但是很多人学 Python 的时候都遇到过问题,特别对于非计算机专业毕业的人来说. 现在的教程非常多,但是绝大部分对于初学者都不够友好. ...
- Python 极简教程(十一)字典 dict
字典是以大括号标识,以键值对(key:value)的形式,无序,不可重复,可变的集合类型. 字典具有非常高效的读写效率. >>> d = {} # 创建一个空字典 >>& ...
- Python 极简教程(三)数据类型
每种语言都有各种数据类型.这就像在现实生活中,我们计数的时候需要用到数字,在表述金额.重量.距离等需要精确计数时用到小数,在日常交谈中要用文字,等等.在计算机语言中,为了表述不同的情况,也需要用到各种 ...
- Python 极简教程(二)编码工具
Python 的编码工具很多.目前最流行的是 pycharm,关于 pycharm 的安装使用请参考 PyCharm安装使用教程. 而学习过程中,我觉得最好用的,还是 Python 自带的练习工具 I ...
- python极简教程05:生成器和匿名函数
测试奇谭,BUG不见. 讲解之前,我先说说我的教程和网上其他教程的区别: 1 我分享的是我在工作中高频使用的场景,是精华内容: 2 我分享的是学习方法,亦或说,是指明你该学哪些.该重点掌握哪些内容: ...
随机推荐
- Python学习第一篇
好久没有来博客园了,今天开始写自己学习Python和Hadoop的学习笔记吧.今天写第一篇,Python学习,其他的环境部署都不说了,可以参考其他的博客. 今天根据MachineLearning里面的 ...
- 【Codeforces Round #425 (Div. 2) A】Sasha and Sticks
[Link]: [Description] [Solution] 傻逼题; 获取n/k; 对n/k的奇偶性讨论一下就好 [NumberOf WA] 0 [Reviw] [Code] #include ...
- UVA 11642 Fire!
Fire! Time Limit: 1000ms Memory Limit: 131072KB This problem will be judged on UVA. Original ID: 116 ...
- 【Android】各式各样的弹出框与对菜单键、返回键的监听
Android自带各式各样的弹出框.弹出框也是安卓主要的组件之中的一个.同一时候安卓程序能够对菜单键.返回键的监听.但在安卓4.0之后就禁止对Home键的屏蔽与监听,强制保留为系统守护按键.假设非要对 ...
- 改动GDAL库支持RPC像方改正模型
近期在做基于RPC的像方改正模型.方便对数据进行測试,改动了GDAL库中的RPC纠正模型,使之能够支持RPC像方改正參数. 以下是RPC模型的公式,rn,cn为归一化之后的图像行列号坐标,PLH为归一 ...
- Android上玩玩Hook?
在中国互联网这片弱肉强食的丛林中.封闭抄袭是垄断巨头的通行证.创新是弱小创业者的墓志铭. 了解Hook 还没有接触过Hook技术读者一定会对Hook一词感觉到特别的陌生.Hook英文翻译过来就是&qu ...
- vim中使用正則表達式
一.使用正則表達式的命令 使用正則表達式的命令最常见的就是 / (搜索)命令. 其格式例如以下: /正則表達式 还有一个非常实用的命令就是 :s(替换)命令,将第一个//之间的正則表達式替换成第二个/ ...
- QT就是别人好心帮你做一些枯燥,并且很重复的代码编写工作,让你更好的把精力投入到你界面的逻辑和功能的实现的功能库(否则写了上万行代码了,才写出个BUG一大堆的毛坯)
好了,现在开始记录我学习QT的学习历程 . 本人也不是计算机专业出来的,自学了一点,但还是不好找工作,于是参加了培训,虽然感觉没多学到什么 编程的学习生涯就是不断的看别人的源码,然后自己参考着写写自己 ...
- es6 --- Generator 函数
第一部分,ES6 中的 Generator 在 ES6 出现之前,基本都是各式各样类似Promise的解决方案来处理异步操作的代码逻辑,但是 ES6 的Generator却给异步操作又提供了新的思路, ...
- html元素的分类有哪些?
今天零度给大家讲一下基本的html元素分类: HTML元素的分类其实主要有两种元素构成——块级元素和内联元素. html元素的分类有块级元素和行内元素 一.块级元素(block)的特点: 1.总是在新 ...