python基本数据类型之集合

集合是一种容器,用来存放不同元素。

集合有3大特点:

  1. 集合的元素必须是不可变类型(字符串、数字、元组);
  2. 集合中的元素不能重复;
  3. 集合是无序的。

在集合中直接存入list或字典类型会直接报错;在创建集合时,重复元素会被剔除;集合是无序的,即集合中的元素无法通过索引进行访问。

集合的定义

集合的定义有两种方式:1、直接定义,即使用大括号{}来表示集合;2、使用set方法从序列中创建集合。

# 第一种方式:使用大括号表示集合,元素之间用逗号隔开
s1 = {'haha', 12, ('nihao', 'yes')}
print(s1) # 第二种方式:从可遍历对象中创建集合
s2 = set('goodmorning')
print(s2)

打印结果:

{('nihao', 'yes'), 12, 'haha'}
{'o', 'd', 'n', 'i', 'm', 'r', 'g'}

可以看到,创建的集合中,重复元素会自动地去除,并且元素的顺序与创建时也有所不同。

集合本身属于可变类型,python提供了许多内置方法来修改集合中的元素;python还提供了另一种不可变的集合,叫frozenset。

fs = frozenset(['haha', 123, (123, 'yeye')])
print(fs)

打印结果:

frozenset({'haha', 123, (123, 'yeye')})

集合元素的添加和删除

集合中的方法有:add\update、clear\pop\remove\discard、difference\difference_update、intersection\intersection_update、symmetric_difference\symmetric_difference_update、isdisjoint\issubset\issuperset、copy、union。

1、添加方法

add方法可以向集合中添加指定元素。

s = {'haha', 'hello', 123, ('gu', 887)}
s.add('good')
print(s)

打印结果:

{'haha', ('gu', 887), 'good', 'hello', 123}

但是add方法每次只能添加一个元素,如果需要添加多个元素,可以使用update方法。

s = {'haha', 'hello', 123, ('gu', 887)}
s.update({'nihao', 222})
print(s)

打印结果:

{'haha', ('gu', 887), 'hello', 123, 222, 'nihao'}

update传入的参数可以是其他的可遍历类型,如字符串、列表、元组等,update方法会将这些序列进行遍历后将元素单个存入集合。

如果update中传入的参数是字典类型,则集合中只会保留字典的key值。(add方法传入的参数必须是不可变类型,所以不能传入字典)。

s = {'haha', 'hello', 123, ('gu', 887)}

d = {
'name': 'harry',
'age': 11
}
s.update(d)
print(s)

打印结果:

{'age', 'name', ('gu', 887), 'haha', 123, 'hello'}

2、删除方法

集合的删除方法有:clear、pop、remove和discard。clear方法是清空集合,用法与字典、列表中的clear方法一致。

集合中的pop方法是随机删除集合中的一个元素并返回。pop方法不需要任何参数。

s = {'haha', 'hello', 123, ('gu', 887)}

v = s.pop()
print(v, s)

打印结果:haha {123, ('gu', 887), 'hello'}

pop方法是随机删除,因此你无法控制程序删除哪一个。而remove和discard方法都可以指定要删除的元素。

s = {'haha', 'hello', 123, ('gu', 887)}

s.remove('hello')
print(s) s.discard(123)
print(s)

打印结果:

{'haha', 123, ('gu', 887)}
{'haha', ('gu', 887)}

remove与discard方法不同的地方在于:如果要删除的元素不存在,remove方法会报错,而discard方法不会。

s = {'haha', 'hello', 123, ('gu', 887)}

s.discard(222)
print(s)

打印结果:{123, ('gu', 887), 'haha', 'hello'}

如果元素不存在,discard方法不会对集合进行任何更改。因此在实际运用中,一般都会使用discard方法。

集合的关系运算

python中的集合可以进行类似于数学集合一样的运算。python中集合的运算包括:交集(intersection)、并集(union)、差集(difference)以及交叉补集(symmetric_difference)。

1、集合的交集

集合的交集就是求在两个集合中都存在的元素,python会将这些元素作为新的集合返回。

s1 = {'Tom', 'Jerry', 'Harry', 'Ron'}
s2 = {'Homonie', 'Ron', 'Hagrid', 'Tom'} v = s1.intersection(s2)
print(v)

打印结果:

{'Ron', 'Tom'}

集合的交集使用intersection方法,但是也有一种更为简便的写法:

v = s1 & s2
print(v)

打印结果:{'Tom', 'Ron'}

&的方法就是表示求两个集合的交集,对于多于两个集合求交,也可以使用这个符号。

s1 = {'Tom', 'Jerry', 'Harry', 'Ron'}
s2 = {'Homonie', 'Ron', 'Hagrid', 'Tom'}
s3 = {'Lily', 'Finger', 'Ron', 'Stanford'} v = s1 & s2 & s3 # &表示AND(和)。
print(v)

打印结果:{'Ron'}

2、集合的并集

集合的并集表示将两个集合中的元素全部放在一个集合中,并去除重复元素。求并集使用的方法是union:

s1 = {'Tom', 'Jerry', 'Harry', 'Ron'}
s2 = {'Homonie', 'Ron', 'Hagrid', 'Tom'} v = s1.union(s2)
print(v)

打印结果:

{'Homonie', 'Jerry', 'Ron', 'Tom', 'Harry', 'Hagrid'}

求并集的简写方法是使用'|'符号,这个符号表示OR(或)的意思。

v = s1 | s2
print(v)

打印结果与使用union时一样。

3、集合的差集

集合的s1与s2的差集表示存在于s1中的但不存在于s2中的元素,差集的方法是difference。同样,求差集也可以简写,差集的符号就是一个减号。

s1 = {'Tom', 'Jerry', 'Harry', 'Ron'}
s2 = {'Homonie', 'Ron', 'Hagrid', 'Tom'} v = s1.difference(s2)
print(v) v1 = s1 - s2
print(v1)

打印结果:

{'Harry', 'Jerry'}
{'Harry', 'Jerry'}

求差集的顺序颠倒过来(s2 - s1)就表示存在于s2中但不存在于s1中的元素。

4、交叉补集

集合的另一种关系运算叫做交叉补集,具体说明先看例子:

s1 = {'Tom', 'Jerry', 'Harry', 'Ron'}
s2 = {'Homonie', 'Ron', 'Hagrid', 'Tom'} v = s1.symmetric_difference(s2)
print(v)

打印结果:

{'Hagrid', 'Jerry', 'Harry', 'Homonie'}

该运算是首先将两个集合内的元素合并,之后去除两个集合共有的元素。在上述例子中,s1与s2合并后的集合为{'Harry', 'Homonie', 'Tom', 'Jerry', 'Hagrid', 'Ron'},s1与s2中共有的元素为:{'Ron', 'Tom'},因此s1与s2的交叉补集就是:

{'Hagrid', 'Jerry', 'Harry', 'Homonie'}

交叉补集也有一个简便的运算符号:^

v = s1 ^ s2
print(v)

5、xxx_update方法

在集合的关系运算中,有几个对应的update方法,该方法表示s1在与另一个集合进行关系运算后,将所得集合重新赋给s1。

存在update方法的运算有:交(intersection_update)、差(difference_update)和交叉补集(symmertric_difference_update)。

例如:

s1 = {'Tom', 'Jerry', 'Harry', 'Ron'}
s2 = {'Homonie', 'Ron', 'Hagrid', 'Tom'} s1.intersection_update(s2)
print(s1)

打印结果:{'Tom', 'Ron'}

注意:union没有_update方法

集合的关系判断

集合的判断方法有3个:isdisjoint、issubset和issuperset

1、isdisjoint方法

该方法用来判断两个集合是否有共有元素,也就是判断它们是否存在交集。如果两个集合没有交集,则返回True;如果两个集合存在共有元素(交集),则返回False。

s1 = {1, 2, 3}
s2 = {4, 5, 6}
s3 = {1, 7, 8} v = s1.isdisjoint(s2)
print(v)
v1 = s1.isdisjoint(s3)
print(v1)

打印结果:

True
False

2、issubset、issuperset方法

issubset方法用来判断一个集合是否是另一个集合的子集;而issuperset则是判断是否是另一个集合的父集。

s1 = {1, 2, 3, 4, 5}
s2 = {2, 3}
s3 = {5, 7} v1 = s2.issubset(s1)
print('s2是否是s1的子集--->', v1) v2 = s3.issubset(s1)
print('s3是否是s1的子集--->', v2) v3 = s1.issuperset(s2)
print('s1是否是s2的父集--->', v3)

打印结果:

s2是否是s1的子集---> True
s3是否是s1的子集---> False
s1是否是s2的父集---> True

每个集合也是自己本身的子集和父集:

v4 = s1.issubset(s1)
print('s1是否是s1(自身)的子集--->', v4) v5 = s1.issuperset(s1)
print('s1是否是s1(自身)的父集--->', v5)

打印结果:

s1是否是s1(自身)的子集---> True
s1是否是s1(自身)的父集---> True

issubset方法的运算关系其实相当于:<=(即小于等于);而issuperset方法的运算关系相当于:>=(大于等于)。

# 使用<=判断子集:
v1 = s2.issubset(s1)
print('s2是否是s1的子集--->', v1) v2 = s2 <= s1
print(v2) v3 = s3 <= s1
print(v3) # 使用>=判断父集:
v4 = s1 >= s3
print('s1 >= s3 ?', v4)

打印结果:

s2是否是s1的子集---> True
True
False
s1 >= s3 ? False

3、关于集合中的运算符号

集合中除了>= 和 <= 符号外,还可以使用>、< 和 = 来判断集合间的关系。具体比较结果如下:

s1 = {1, 2, 3, 4, 5}
s2 = {1, 2, 3}
s3 = {1, 2, 3, 4, 5} v1 = s1 > s2
v2 = s1 >= s2
print('s1 > s2 吗?--->', v1)
print('s1 >= s2 吗?--->', v2) v3 = s1 > s3
v4 = s1 >= s3
print('s1 > s3 吗?--->', v3)
print('s1 >= s3 吗?--->', v4)

打印结果:

s1 > s2 吗?---> True
s1 >= s2 吗?---> True
s1 > s3 吗?---> False
s1 >= s3 吗?---> True

可以这样理解:<= 与 >=都是来判断集合之间是否是子集和父集的;而 < 与 > 是来判断集合之间是否是真子集或'真父集'的关系的。

python基本数据类型之集合的更多相关文章

  1. Python基础数据类型之集合

    Python基础数据类型之集合 集合(set)是Python基本数据类型之一,它具有天生的去重能力,即集合中的元素不能重复.集合也是无序的,且集合中的元素必须是不可变类型. 一.如何创建一个集合 #1 ...

  2. python基本数据类型之集合set

    一.集合的定义 set集合,是一个无序且不重复的元素集合. 集合对象是一组无序排列的可哈希的值,集合成员可以做字典中的键.集合支持用in和not in操作符检查成员,由len()内建函数得到集合的基数 ...

  3. Python基础数据类型之集合以及其他和深浅copy

    一.基础数据类型汇总补充 list  在循环一个列表时,最好不要删除列表中的元素,这样会使索引发生改变,从而报错(可以从后向前循环删除,这样不会改变未删元素的索引). 错误示范: lis = [,,, ...

  4. Python开发——数据类型【集合】

    集合的定义 由一个或多个确定的元素所构成的整体 可变集合 s=set('hello') print(s) # {'e', 'l', 'o', 'h'} s=set(['alex','alex','Lu ...

  5. Python - 基础数据类型 set 集合

    集合的简介 集合是一个无序.不重复的序列 它的基本用法包括成员检测和消除重复元素 集合对象也支持像 联合,交集,差集,对称差分等数学运算 集合中所有的元素放在 {} 中间,并用逗号分开 集合的栗子 这 ...

  6. python【数据类型:集合】

  7. python之数据类型补充、集合、深浅copy

    一.内容回顾 代码块: 一个函数,一个模块,一个类,一个文件,交互模式下,每一行就是一个代码块. is == id id()查询对象的内存地址 == 比较的是两边的数值. is 比较的是两边的内存地址 ...

  8. python 标准类库-数据类型之集合-容器数据类型

    标准类库-数据类型之集合-容器数据类型   by:授客 QQ:1033553122 Counter对象 例子 >>> from collections import Counter ...

  9. Python基础数据类型-列表(list)和元组(tuple)和集合(set)

    Python基础数据类型-列表(list)和元组(tuple)和集合(set) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 本篇博客使用的是Python3.6版本,以及以后分享的 ...

随机推荐

  1. [sharepoint]修改Item或者File的Author和Editor

    写在前面 最近项目中调用sharepoint rest api方式获取文件或者Item列表,而用的方式是通过证书请求,在上传文件,或者新建item的时候,默认的用户是在sharepoint端注册的用户 ...

  2. background-size的应用情景:当给出的背景图片大于实际网页需要布局的图片大小时

    网页需求是:50*50 如果只设置  width:50px;height:50px;background-image("images/XXX.png"); 效果如下: 添加设置:b ...

  3. css3属性box-sizing:border-box 用法解析

    响应式Web设计经常需要我们通过百分比设置组件宽度.如果我们不考虑边框,那么很容易就可以实现,但如果你给每一列以及总宽度都采用百分比设置,那这个时候固定的边框大小就会出来捣乱.下面我们将看到一组方法去 ...

  4. vlan划分

    1.vlan:虚拟局域网: 作用:划分广播域,抑制广播风暴: 2.vlan技术的优点: 有效控制广播域范围: 增强局域网的安全性: 灵活构建虚拟工作组: 3.vlan划分的方式: 基于端口: 基于MA ...

  5. 直接从硬盘安装centos7网址整理

    1.https://blog.csdn.net/happy_joker/article/details/52822025 注意:(1)第3步-->Linux引导安装-->软件选择--> ...

  6. 在Docker环境下部署Kafka

    参考:https://blog.csdn.net/u011537073/article/details/70767064

  7. 多进程模块 multiprocessing

    由于GIL的存在,python中的多线程其实并不是真正的多线程,如果想要充分地使用多核CPU的资源,在python中大部分情况需要使用多进程. multiprocessing包是Python中的多进程 ...

  8. C#、Unity 数据类型的默认值

    using System.Collections; using System.Collections.Generic; using UnityEngine; public class Main : M ...

  9. kettle学习笔记(二)——kettle基本使用

    一.子程序功能和启动方式介绍 Spoon.bat: 图形界面方式启动作业和转换设计器. Pan.bat: 命令行方式执行转换. Kitchen.bat: 命令行方式执行作业. Carte.bat: 启 ...

  10. 导出word文档 通过DocX组件

    根据DocX官方描述如下: In the application development process, it uses COM libraries and requires MS Word or ...