使用字典快速获取唯一值与重复值【单个字典对象】

news2024/11/19 14:52:06

在以前的博客《使用字典快速获取唯一值与重复值(交集与并集)》使用多个字典对象获取交集与并集,最近有同学提问,是否可以只使用一个字典对象实现相同的功能,对于有“编程洁癖”的同学来说,可能不喜欢使用多个字典对象。

实例需求:表1和表2为两个名单,不同班级有同名的学生,例如表2中有两个小王(截图中黄色单元格),因此需要使用班级+姓名作为学生的唯一识别标识,现在需要统计如下三个清单

  • 表1有表2无
  • 表1无表2有
  • 两表共有

在这里插入图片描述

示例代码如下。

Sub demo()
    Set objDic = CreateObject("scripting.dictionary")
    arr = ActiveSheet.Range("a2").CurrentRegion
    For i = 3 To UBound(arr)
        sKey = arr(i, 2) & "|" & arr(i, 3)
        objDic(sKey) = 1
    Next
    brr = ActiveSheet.Range("e2").CurrentRegion
    For i = 3 To UBound(brr)
        sKey = brr(i, 2) & "|" & brr(i, 3) 
        If objDic.Exists(sKey) Then 
            objDic(sKey) = 3
        Else
            objDic(sKey) = 2
        End If
    Next
    range("I3:P31").clearcontents
    iRow = 3: lRow = 3: oRow = 3
    For Each strKey In objDic.Keys
        If objDic(strKey) = 1 Then
            ActiveSheet.Cells(iRow, "I").Resize(, 2) = Split(strKey, "|")
            iRow = iRow + 1
        ElseIf objDic(strKey) = 2 Then
            ActiveSheet.Cells(lRow, "L").Resize(, 2) = Split(strKey, "|")
            lRow = lRow + 1
        ElseIf objDic(strKey) = 3 Then
            ActiveSheet.Cells(oRow, "O").Resize(, 2) = Split(strKey, "|")
            oRow = oRow + 1
        End If
    Next
    Set objDic = Nothing
End Sub

【代码解析】
第1行代码创建字典对象。
第3行代码将表1读取到数组中。
第4~7行代码循环遍历表1中的数据。
第5行代码将班级和姓名组合作为字典对象的键,其中使用竖线作为分隔符,以便于回写数据时进行拆分。
第6行代码将键加入到字典中,其值设置为1。
第8~16行处理表2的数据,主要结构同上。
第11行代码判断键是否存在于字典中。

  • 如果存在,说明是两表共用的数据,第12行代码将值修改为3。
  • 如果不存在,说明是表2独有的数据,第14行代码将值修改为2。

至此,将全部数据加载到字典对象中,根据键值(1,2,3)可以区分该学生属于哪个清单。
第17行代码清空结构单元格区域。
第18行代码设置3个清单的起始行为第3行。
第19~30行代码循环遍历字典对象中的键。
第20~29行代码根据键值,分别写入I、L或者O列相应的单元格中。
其中,resize(, 2)将单元格区域扩展至一行两列,即两个单元格。
Split函数将拆分班级和姓名,用于写入单元格区域。
第30行代码释放对象变量所占用的系统资源。


字典对象很灵活,充分利用其特性可以实现很多功能,希望本文对于各位同学有帮助。

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

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

相关文章

记录:windows+opencv3.4.16+vs2013+cmake编译

环境:vs2013,x64,opencv3.4.16,cmakeopencv官网:https://opencv.org/releases/1、opencv source下载:因为想用vs2013,现在opencv官网windows版安装包只有vc14和vc15了,只能自己编译了。找一个自…

良心无广的3款软件,每一款都逆天好用,且用且珍惜

闲话少说,直上干货! 1、清浊 清浊是一款强大到离谱的国产手机清理APP,追求简约至上,界面非常清爽,无任何弹弹屏广告,值得关注的是,这款软件完全免费使用,常规清理、应用清理、空文件…

活体识别4:论文笔记之《Face Spoofing Detection Using Colour Texture Analysis》

说明 本文是我对论文《Face Spoofing Detection Using Colour Texture Analysis》做的一个简单笔记。 这个论文是芬兰奥卢大学(Oulu)课题组的一篇很有代表性的论文,写于2016年,使用的是“手工特征SVM分类器”这种比较传统的方案,方案不复杂&…

吾爱2023新年红包题第三题

吾爱论坛2023年春节红包安卓题,随便玩一玩; https://www.52pojie.cn/thread-1738015-1-1.html 第三题:https://www.52pojie.cn/home.php?modtask&doview&id22 首先我们下载后,打开apk是提示要点击 999次即可通关&…

Docker - 4. Docker 帮助启动类命令

目录 1. 启动 docker 2. 停止 docker 3. 重启 docker 4. 查看 docker 状态 5. 保持开机自动启动 6. 显示 docker 版本信息 7. 显示 docker 系统信息 8. 查看 docker 总体帮助文档 9. 查看 docker 命令帮助文档 1. 启动 docker systemctl start docker 2. 停止 dock…

macm1安装tensorflow以及pycharm配置

macm1安装tensorflow以及pycharm配置 本文目录macm1安装tensorflow以及pycharm配置使用MacOS 12安装conda创建一个conda环境安装tensorflowpycharm配置使用MacOS 12 必需条件:macOS 12 安装conda 安装Miniforge(包含conda及一个python环境)…

RabbitMQ消息队列实战(2)—— Java调用RabbitMQ的三种方式

本文主要介绍Java中调用RabbitMQ的三种方式。三种方式实际上对应了三种不同的抽象级别:首先,通过Java原生代码来访问RabbitMQ。在这种方式下,需要手动创建Connection,创建Channel,然后通过Channel对象可以显式的创建Ex…

基于springboot+vue的问卷调查系统(前后端分离)

博主主页:猫头鹰源码 博主简介:Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容:毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 功能分析…

学校机房高效稳定,一招见效

校园安全作为公共安全领域重要的一部分,一直以来都格外受到重视。近年来,各地区陆续发布了多项加强校园安全管理的政策、法规及标准规范,旨在贯彻落实构建“平安校园”的宗旨,不断完善校园的人防、物防、技防建设。 学校机房常见四…

AutoLisp演练(二)

一、自动绘制出多个等半径圆相切 1.输入基准点baspt 2.输入小圆半径rad 3. 输入欲相切的圆的数量num 4.自动绘制出多个等半径圆相切 5. 涉及到相关变量,设定为baspt、rad、num、midpt、cenpt、kk、ang1、ang2 二、程序代码实现 三、测试及效果 测试一 四、…

盘点一些惊艳一时的 CSS 属性

✨ 个人主页:山山而川~xyj ⚶ 作者简介:前端领域新星创作者,专注于前端各领域技术,共同学习共同进步,一起加油! 🎆 系列专栏: web 大前端 🚀 学习格言:与其临…

2023爬虫学习笔记 -- 某狗网站爬取数据

一、爬取某狗网站的首页1、导入需要的库文件import requests2、指定我们要访问的网址网页"https://www.sogou.com"3、获取服务器的返回的所有信息响应requests.get(网页)4、通过text属性,从返回信息中读取字符串内容响应内容响应.text5、查看读取到的内容…

唐宇迪机器学习实战课程笔记(全)

1. 线性回归1.1线性回归理论1.2线性回归实战2.分类模型评估(Mnist实战SGD_Classifier)2.1 K折交叉验证K-fold cross validation2.2 混淆矩阵Confusion Matrix2.3 准确率accuracy、精度precision、召回率recall、F12.4 置信度confidence2.5 ROC曲线3.训练调参基本功(LinearRegre…

1612_PC汇编语言_条件以及控制结构

全部学习汇总: GreyZhang/g_unix: some basic learning about unix operating system. (github.com) 这一次简单看看条件分支以及控制结构,感觉看完这部分之后,汇编的大部分框架已经有个差不多了。我的目的并不是成为汇编高手,因此…

数据处理——增删改

文章目录插入数据方式一:values方式2:将查询结果插入到表中更新数据删除数据MySQL8新特性:计算列综合案例插入数据 用INSERT插入数据 方式一:values 使用这种语法一次只能向表中插入一条数据。 情况1:为表的所有字段…

1月,不要跳槽

新年结束了,一些不满现状,被外界的“高薪”“好福利”吸引的人,一般就在这时候毅然决然地跳槽了。 在此展示一套学习笔记 / 面试手册,年后跳槽的朋友可以好好刷一刷,还是挺有必要的,它几乎涵盖了所有的软件…

通信原理笔记—码间串扰与波形传输无失真的条件(奈奎斯特第一准则)

目录 波形传输的无失真条件: 码间串扰问题: 奈奎斯特第一准则: 在抽样判决时刻没有码间串扰的信号波形示例: 具有最窄频带的无码间串扰基带传输系统: 无码间串扰基带系统的主要参数: 一种典型的滚降…

golang中的图像image处理详解

常用的图像格式有png,jpeg,gif,对应的文件后缀为png,jpg,gif,当然文件的具体内容编码才能证明存放的是哪种文件,图像文件的头部都存储了具体标志,比如jpeg前缀\xffd8,png…

Redis实现消息队列

7、Redis消息队列 7.1 Redis消息队列-认识消息队列 什么是消息队列:字面意思就是存放消息的队列。最简单的消息队列模型包括3个角色: 消息队列:存储和管理消息,也被称为消息代理(Message Broker)生产者&…

定位tcp连接或端口是属于哪个进程

首先要知道tcp连接的端口号,要么是本地端口号要是么remote端口号。有的端口号我们已知,有的端口号可以通过日志获取,也可以抓包获取,如然后是用netstat命令获取pidlinux下使用netstat -anpt(a是输出所有n是展示端口号&…