热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

5.【Python编程】集合Set相关知识及基本操作

目录5.【Python编程】集合Set相关知识及基本操作5.1集合的创建5.2集合的常见操作5.3集合的基本运算5.4元素与集合的关系5.【Python编程】集合Set相关知识及基

目录

  • 5.【Python编程】集合Set相关知识及基本操作
    • 5.1 集合的创建
    • 5.2 集合的常见操作
    • 5.3 集合的基本运算
    • 5.4 元素与集合的关系


5.【Python编程】集合Set相关知识及基本操作

备注: 本教程主要使用Python3.6在jupyter notebook上编程实现。Python环境配置参考《【Python学习】Windows10开始你的Anaconda安装与Python环境管理》或者《【Python学习】纯终端命令开始你的Anaconda安装与Python环境管理》。

5.1 集合的创建

集合(set)是一个无序的不重复元素序列。可以使用大括号{ }或者set()函数创建集合,注意:创建一个空集合必须用set()而不是{ },因为{ }是用来创建一个空字典。此外,集合中的元素必须是不可变类型
python3版本,对于数据量很小的集合并且数字很少的时候,确实是做了一个排序,但集合的本质还是无序的!
Python内置的集合set中元素顺序是按元素的哈希值进行存储的,并不是按先后顺序。

  • 可以被哈希的数据结构:int、float、str、tuple 和 NoneType。
  • 不可以被哈希的数据结构:dict、list 和 set。
    参考:python集合中的元素必须是可哈希的

set1 = {"北京","上海","广州","深圳","成都"}
print(set1)
set2 = set()
print(set2)
list1 = [1,1,1,2,2,3,4,5,6,7,8,8,9,10]
set3 = set(list1) # 集合具有去重功能
print(set3)

{'成都', '深圳', '上海', '广州', '北京'}
set()
{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}

# 集合的元素是按元素的哈希值进行存储的
set4 = set([9,4,1,6,100,101,119,222,333,301,1000,1301,200])
print(set4)set4_2 = set([9,4,1,6,100,101,119,222,333,301,1000,1301,200])
print(set4_2)set5 = set([4,9,1,6,222,101,119,100,333,301,1000,1301,200])
print(set5)

{1, 100, 4, 6, 101, 1000, 9, 200, 333, 301, 1301, 119, 222}
{1, 100, 4, 6, 101, 1000, 9, 200, 333, 301, 1301, 119, 222}
{1, 4, 101, 6, 100, 1000, 9, 200, 333, 301, 1301, 119, 222}

5.2 集合的常见操作


  • 集合推导式

# 找出字符串'我是中国人,中国人不骗中国人'中存在而字符串'我是谁'中不存在的所有元素
set1 = {x for x in '我是中国人,中国人不骗中国人' if x not in '我是谁'} # 与列表推导式的区别是使用了“{}”
print(set1)

{',', '国', '中', '骗', '不', '人'}

  • 计算集合的元素个数

empty_set = set()
print("len(empty_set)=", len(empty_set))
set1 = {1,3,5,7,9}
print("len(set1)=", len(set1))

len(empty_set)= 0
len(set1)= 5

  • 清空集合

set1 = {1,3,5,7,9}
print(set1)
set1.clear()
print("执行set1.clear()之后...")
print(set1) # set()表示空集

{1, 3, 5, 7, 9}
执行set1.clear()之后...
set()

  • 集合增加元素

A = {1,2,3,4,5,6}
print(A)
A.add(1)
print(A)
A.add(7)
print(A)

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

A.update(x)可以添加元素,且参数可以是列表,元组,字典

A = {1,2,3,4,5,6}
A.update([1,3],[8,9]) # 列表
print(A)
A.update((11,12,13)) # 元组
print(A)
A.update({15,16,17}) # 集合
print(A)
A.update({18:19,20:21}) # 字典
print(A) # 字典的键会被添加到集合当中

{1, 2, 3, 4, 5, 6, 8, 9}
{1, 2, 3, 4, 5, 6, 8, 9, 11, 12, 13}
{1, 2, 3, 4, 5, 6, 8, 9, 11, 12, 13, 15, 16, 17}
{1, 2, 3, 4, 5, 6, 8, 9, 11, 12, 13, 15, 16, 17, 18, 20}

  • 移除集合当中的元素

A = {1,2,3,4,5,6}
A.remove(1)
#A.remove(7) # 元素必须在集合当中,否则会报错如下:
'''
---------------------------------------------------------------------------
KeyError Traceback (most recent call last)
in 1 A = {1,2,3,4,5,6}2 A.remove(1)
----> 3 A.remove(7) # 元素必须在集合当中,否则会报错如下:
KeyError: 7
'''

print(A)
A.discard(2) # # 元素不一定需要在集合当中
A.discard(8)
print(A)

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

  • .pop()函数的特性
    参考:Python Set pop() 方法

集合里只有0~31范围内的数字,执行.pop()删除时, 删掉的是最小的数字, 其余数字升序排列
实际上,.pop执行的是删除实际存储在集合当中最前面的元素

set1 = {9,31,4,1,6,21,8,3,11,0,21,24,25,29} #,99,21,35,33,34}
print("set1:",set1) # 自动按从小到大排序
set1.pop()
print("set1:",set1)
set1.pop()
print("set1:",set1)
set1.pop()
print("set1:",set1)set2 = {9,4,1,6,100,101,119,222,333,301,1000,1301,200}
print("set2:",set2) # 自动按从小到大排序
set2.pop() # 移除1
print("set2:",set2)
set2.pop() # 移除100
print("set2:",set2)
set2.pop() # 移除4
print("set2:",set2)set3= set('我是中国人')
print("set3:",set3)
set3.pop()
print("set3:",set3)
set3.pop()
print("set3:",set3)
set3.pop()
print("set3:",set3)

set1: {0, 1, 3, 4, 6, 8, 9, 11, 21, 24, 25, 29, 31}
set1: {1, 3, 4, 6, 8, 9, 11, 21, 24, 25, 29, 31}
set1: {3, 4, 6, 8, 9, 11, 21, 24, 25, 29, 31}
set1: {4, 6, 8, 9, 11, 21, 24, 25, 29, 31}
set2: {1, 100, 4, 6, 101, 1000, 9, 200, 333, 301, 1301, 119, 222}
set2: {100, 4, 6, 101, 1000, 9, 200, 333, 301, 1301, 119, 222}
set2: {4, 6, 101, 1000, 9, 200, 333, 301, 1301, 119, 222}
set2: {6, 101, 1000, 9, 200, 333, 301, 1301, 119, 222}
set3: {'国', '中', '是', '我', '人'}
set3: {'中', '是', '我', '人'}
set3: {'是', '我', '人'}
set3: {'我', '人'}

5.3 集合的基本运算

set()list()的区别

# 利用set的特性,计算字符串有多少个不同的字符
sentence_set = set('我是中国人,中国人不骗中国人')
print(sentence_set)
print('句子中的不同字符个数:',len(sentence_set))
# 利用list把句子转化为字组成的列表,BERT、GPT模型常用的NLP处理操作
sentence_list = list('我是中国人,中国人不骗中国人')
print(sentence_list)
print('句子的长度:',len(sentence_list))

{'我', ',', '国', '骗', '是', '人', '中', '不'}
8
['我', '是', '中', '国', '人', ',', '中', '国', '人', '不', '骗', '中', '国', '人']

两个集合的基本运算

  • 并集:集合A或者集合B中存在的元素

A = {1,2,3,4}
B = {3,4,5,6}
print("集合A与B的并集:",A | B)
C = A.union(B) # C=A+B,union: 联合
print("集合A与B的并集:", C)

集合A与B的并集: {1, 2, 3, 4, 5, 6}
集合A与B的并集: {1, 2, 3, 4, 5, 6}

  • 交集:集合A与集合B中都存在的元素

A = {1,2,3,4}
B = {3,4,5,6}
print("集合A与B的交集:",A & B)
D = A.intersection(B) # D=A+B,intersection: 交叉
print("集合A与B的交集:", D)

集合A与B的交集: {3, 4}
集合A与B的交集: {3, 4}

  • 补集/差集:集合A中存在而集合B中不存在的元素

A = {1,2,3,4}
B = {3,4,5,6}
print("集合A与B的差运算:",A - B)
E = A.difference(B) # E=A-B
print("集合A与B的差运算",E)

集合A与B的差运算: {1, 2}
集合A与B的差运算 {1, 2}

  • A^B= (A-(A&B))|(B-(A&B))

A = {1,2,3,4}
B = {3,4,5,6}
print("集合A与B中不同时存在的元素:",A ^ B)
F = A.symmetric_difference(B)
print("集合A与B中不同时存在的元素:",F)
print("集合A与B中不同时存在的元素:",(A-(A&B))|(B-(A&B)))

集合A与B中不同时存在的元素: {1, 2, 5, 6}
集合A与B中不同时存在的元素: {1, 2, 5, 6}
集合A与B中不同时存在的元素: {1, 2, 5, 6}

5.4 元素与集合的关系

A = {1,2,3,4,5,6,7}
print(1 in A)
print(8 in A)

True
False


推荐阅读
  • 本文由编程笔记#小编为大家整理,主要介绍了logistic回归(线性和非线性)相关的知识,包括线性logistic回归的代码和数据集的分布情况。希望对你有一定的参考价值。 ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • C# 7.0 新特性:基于Tuple的“多”返回值方法
    本文介绍了C# 7.0中基于Tuple的“多”返回值方法的使用。通过对C# 6.0及更早版本的做法进行回顾,提出了问题:如何使一个方法可返回多个返回值。然后详细介绍了C# 7.0中使用Tuple的写法,并给出了示例代码。最后,总结了该新特性的优点。 ... [详细]
  • 不同优化算法的比较分析及实验验证
    本文介绍了神经网络优化中常用的优化方法,包括学习率调整和梯度估计修正,并通过实验验证了不同优化算法的效果。实验结果表明,Adam算法在综合考虑学习率调整和梯度估计修正方面表现较好。该研究对于优化神经网络的训练过程具有指导意义。 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • HDFS2.x新特性
    一、集群间数据拷贝scp实现两个远程主机之间的文件复制scp-rhello.txtroothadoop103:useratguiguhello.txt推pushscp-rr ... [详细]
  • 也就是|小窗_卷积的特征提取与参数计算
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了卷积的特征提取与参数计算相关的知识,希望对你有一定的参考价值。Dense和Conv2D根本区别在于,Den ... [详细]
  • Imtryingtofigureoutawaytogeneratetorrentfilesfromabucket,usingtheAWSSDKforGo.我正 ... [详细]
  • IjustinheritedsomewebpageswhichusesMooTools.IneverusedMooTools.NowIneedtoaddsomef ... [详细]
  • 本文介绍了在iOS开发中使用UITextField实现字符限制的方法,包括利用代理方法和使用BNTextField-Limit库的实现策略。通过这些方法,开发者可以方便地限制UITextField的字符个数和输入规则。 ... [详细]
  • 本文讨论了微软的STL容器类是否线程安全。根据MSDN的回答,STL容器类包括vector、deque、list、queue、stack、priority_queue、valarray、map、hash_map、multimap、hash_multimap、set、hash_set、multiset、hash_multiset、basic_string和bitset。对于单个对象来说,多个线程同时读取是安全的。但如果一个线程正在写入一个对象,那么所有的读写操作都需要进行同步。 ... [详细]
author-avatar
乖乖雯莉_775
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有