使用setdefault撰写文本索引脚本(出自Fluent Python案例)

背景介绍

由于我们主要介绍撰写脚本的方法,所以用一个简单的文本例子进行分析

a[(19,18),(20,53)]
Although[(11,1),(16,1),(18,1)]
ambiguity[(14,16)]

以上内容可以保存在一个txt文件中,任务是统计文件中每一个词(包括字母,数字以及下划线的组合)位置,建立一个映射表,主键是词的内容,值是包含对应词位置的列表数据,列表的每一个元素是词出现的位置对应的元组


一般方法

import re
match = re.compile(r'\w+')
match_dist_3 = {}
with open('./num.txt',encoding='utf-8') as w:
    for row_id,line in enumerate(w,1):
        for word_match in match.finditer(line):

            col_id = word_match.start()+1
            word = word_match.group()
            postion = (row_id,col_id)
            postion_list = match_dist_3.get(word,[])
            postion_list.append(postion)
            match_dist_3[word]=postion_list
print(match_dist_3)

match = re.compile(r'\w+')是定义正则匹配的规则,获得连续出现的字母、数字或者下划线的分割,enumerate(w,1)是获取从1开始的计数,match.finditer(line)是按照正则分割的规则对文本文件中的每一行进行分割获得想要排上位置序号的文本内容,col_id = word_match.start()+1是获取匹配的序号,这里可以理解为在文本中的列号(我们的行和列都默认从1开始计数)

postion是储存文本数据位置的元组, postion_list = match_dist_3.get(word,[])是获取match_dist_3字典中以word为主键的值赋值给postion_list,如果没有则返回空表, postion_list.append(postion)接着对postion_list增加元素,最后再把更新后的postion_list赋值到对应的主键位置上,完成映射表的更新

从上面的代码可以看出,对于字典类型的映射表的更新,需要先获得值再进行更新后再赋值回去,来来回回需要三步,显得代码有些冗余,而setdefault的使用可以直接就地更新字典的值

setdefault方法

match_dist = {}
with open('./num.txt',encoding='utf-8') as w:
    for row_id,line in enumerate(w,1):
        for word_match in match.finditer(line):
            col_id = word_match.start()+1
            word = word_match.group()
            postion = (row_id,col_id)
            match_dist.setdefault(word,[]).append(postion)

我们可以直接通过 match_dist.setdefault(word,[]).append(postion)这一行代码完成一般方法中的三行代码的功能,其含义是查找match_dist字典中的word主键对应的值,若不存在则返回空表,并在此基础上直接加上新获取的word对应的postion,使得代码简洁了需要

我们来打印输出一下

for word in sorted(match_dist,key=str.upper):  # 直接显示的是主键
    print(word,match_dist[word])

可以看到已经成功获得每个word对应的位置的映射表

欢迎大家讨论交流~


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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux------进程的初步了解

目录 一、什么是进程 二、进程的标识符pid 三、getpid 得到进程的PID 四、kill 终止进程 五、父进程与子进程 六、目录中的进程 一、什么是进程 在windows中,我们查看进程很简单,打开任务管理器,就可以看到在运行的进程。这里我们还可以…

红队专题-反序列化攻击-Tools-Ysoserial

Ysoserial 招募六边形战士队员ysoserial-0.0.6-SNAPSHOT-all.jarysoserial的原生CB1的链CC6链在ysoserial编写自己的payload ysoserial.net前言 参考文章 招募六边形战士队员 一起学习 代码审计、安全开发、web攻防、逆向等。。。 私信联系 ysoserial-0.0.6-SNAPSHOT-all.ja…

POI-tl 知识整理:整理2 -> 标签

1 文本标签 {{var}} 数据模型: String :文本 TextRenderData :有样式的文本 HyperlinkTextRenderData :超链接和锚点文本 Object :调用 toString() 方法转化为文本 代码示例: Testpublic void testText…

Brc20钱包横评推荐:谁更适合玩铭文?

加密货币的世界越来越热闹,新的创意层出不穷!最近,BRC-20 通证标准成了这个圈子的新宠儿,这是在比特币网络上诞生的一种超酷的新型可替代通证。和以太坊的 ERC-20 通证一样牛,但 BRC-20 通证是 Ordinals 协议的杰作&am…

spring boot application yaml key下划线如何转java的Properties对象字段驼峰

spring boot yaml key和value如何映射到Properties对象 下面以MybatisPlusProperties为例 ##java properties 字段驼峰 ##yaml文件如图,key使用下划线 ##java对象驼峰转下划线匹配yaml文件key DataObjectPropertyName.toDashedForm(name);//驼峰转下划线 ##设置P…

ES自动补全

安装IK分词器 要实现根据字母做补全,就必须对文档按照拼音分词。在GitHub上恰好有elasticsearch的拼音分词插件。地址:GitHub - medcl/elasticsearch-analysis-pinyin: This Pinyin Analysis plugin is used to do conversion between Chinese characte…

【神经网络算子】

神经网络算子(1)——DeepONet介绍 AI与PDE(三):大概是最好懂的DeepONet模型解析 算子把函数映射为函数。 输入函数u,在固定的sensors上:x_1,x_2,…,x_m。即u(x_i)和y。 输出函数G(u),在随机的y上。即G(u)(…

HUAWEI华为MateStation S台式机电脑12代PUC-H7621N,H5621N原装出厂Windows11.22H2系统

链接:https://pan.baidu.com/s/1QtjLyGTwMZgYiBO5bUVPYg?pwd8mx0 提取码:8mx0 原厂WIN11系统自带所有驱动、出厂主题壁纸、系统属性专属联机支持标志、Office办公软件、华为电脑管家等预装程序 文件格式:esd/wim/swm 安装方式&#xf…

大模型实战05——LMDeploy大模型量化部署实践

大模型实战05——LMDeploy大模型量化部署实践 1、大模型部署背景 2、LMDeploy简介 3、动手实践环节——安装、部署、量化 注 笔记内容均为截图 笔记课程视频地址:https://www.bilibili.com/video/BV1iW4y1A77P/?spm_id_from333.788&vd_source2882acf8c823ce…

Costco攻入山姆大本营

01 Costco深圳店开业火爆 “我今天不去Costco,早上还没开业,路上就已经堵车了,看来今天人很多,过几天再去”,原本计划在Costco开业当天去逛逛的张芸(化名)无奈只能放弃。 家住在Costco深圳店旁…

基于Java SSM框架实现医院管理系统项目【项目源码】计算机毕业设计

基于java的SSM框架实现医院管理系统演示 SSM框架 当今流行的“SSM组合框架”是Spring SpringMVC MyBatis的缩写,受到很多的追捧,“组合SSM框架”是强强联手、各司其职、协调互补的团队精神。web项目的框架,通常更简单的数据源。Spring属于…

【算法】了解哈希表/思想 并用哈希解算法题(C++)

文章目录 基本了解解题1.两数之和面试题01.02.判定是否互为字符重排217.存在重复元素219.存在重复元素II49.字母异位词分组 基本了解 哈希表是什么? 一种数据结构,用于存储元素。 有什么用? 用于快速查找元素 与 插入 何时用哈希表&…

最大公约数和最小公倍数

1. 最大公约数 给定两个整数,求这两个数的最大公约数 暴力求解: 从较小的那个数开始,依次递减,直到某个数能够同时被整除 //暴力求解 int main() {int a 0;int b 0;scanf("%d %d", &a, &b);int i 0;int min …

Matlab深度学习进行波形分割(二)

🔗 运行环境:Matlab 🚩 撰写作者:左手の明天 🥇 精选专栏:《python》 🔥 推荐专栏:《算法研究》 🔐#### 防伪水印——左手の明天 ####🔐 💗 大家…

三、ngxin虚拟主机

目录 什么是nginx虚拟主机修改端口 访问页面1、配置nginx.config 文件2、 添加配置给目录中写入内容检测nginx 是否有语法错误(nginx -t)重启 nginx查看配置结果 不同主机网卡 查看到不同的页面先添加一个临时ip修改ngixn配置文件创建目录文件检测nginx …

聊聊websocket那些事

前端必备工具推荐网站(免费图床、API和ChatAI等实用工具): http://luckycola.com.cn/ 一、什么是websocket? WebSocket 是一种在单个 TCP 连接上进行全双工通信的网络协议。 它是 HTML5 中的一种新特性,能够实现 Web 应用程序和服务器之间的实时通信,…

C++PythonC# 三语言OpenCV从零开发(1):环境配置

文章目录 前言课程选择环境配置PythonC#COpenCV官网下载新建C项目测试运行Csharp版Python版 gitee仓库总结 前言 由于老王我想转机器视觉方向的上位机行业,我就打算开始从零学OpenCV。但是目前OpenCV有两个官方语言,C和Pyhont。C# 有大佬做了对应的Open…

数据结构——顺序二叉树——堆

1.树的相关概念 在介绍二叉树之前,我们首先要明确树是什么。 树用我们的通常认识来判断应该是一种植物,从根向上生长,分出许多的树枝并长出叶子。对于数据结构中的树而言,其结构也正是从树的特征中剥离出来的。树结构是一种非线性…

8 - MySQL数据读写分离|MySQL多实例

MySQL数据读写分离|MySQL多实例 MySQL数据读写分离数据读写分离如何实现数据的读写分离提供数据读写分离服务的软件(中间件)maxscale 软件提供的读写分离服务的工作过程配置数据读写分离结构 提供数据存储服务 MySQL多实例 MySQL数据读写分离…

[NAND Flash 6.4] NAND FLASH基本读操作及原理_NAND FLASH Read Operation源码实现

依公知及经验整理,原创保护,禁止转载。 专栏 《深入理解NAND Flash》 <<<< 返回总目录 <<<< ​全文 6000 字 内容摘要 NAND Flash 引脚功能 读操作步骤 NAND Flash中的特殊硬件结构 NAND Flash 读写时的数据流向 Read 操作时序 读时序操作过…