使用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()+1word = 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()+1word = 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对应的位置的映射表

欢迎大家讨论交流~


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

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

相关文章

评估LLM在细胞数据上的实用性(2)-细胞层面的评估

本文衔接上一篇:评估LLM在细胞数据上的实用性(1)-基本概述 目录 定义参数和任务批次整合多模态整合细胞类型注释 细胞层面的评估批次整合多模态整合细胞类型注释 定义 我们考虑一个预训练LLM表示为 M ( x , θ ) M(x,\theta) M(x,θ),其基于单细胞数据…

RAG 评估框架 -- RAGAS

原文 引入 RAG(Retrieval Augmented Generation)的原因 随着ChatGPT的推出,很多人都理所当然直接用LLM当作知识库回答问题。这种想法有两个明显的缺点: LLM无法得知在训练之后所发生的事情,因此无法回答相关的问题存…

从零开始学习Python基础语法:打开编程大门的钥匙

文章目录 一、引言1.1 Python作为一种流行的编程语言的介绍1.2 Python的应用领域和适用性 二、为什么选择Python2.1 Python的简洁性和易读性2.2 Python的跨平台特性 三、Python在数据科学和人工智能领域的应用3.1 第一个Python程序3.1.1 Hello, World!:编写并运行你…

统信UOS_麒麟KYLINOS上使用Remmina远程Windows并传输文件

原文链接:统信UOS/麒麟KYLINOS上使用Remmina远程Windows并传输文件 hello,大家好啊!继之前我们讨论了在统信UOS/麒麟KYLINOS与Windows之间通过Open SSH实现文件传输之后,今天我要给大家带来的是如何使用Remmina软件在统信UOS/麒麟…

12.2内核空间基于SPI总线的OLED驱动

在内核空间编写SPI设备驱动的要点 在SPI总线控制器的设备树节点下增加SPI设备的设备树节点,节点中必须包含 reg 属性、 compatible 属性、 spi-max-frequency 属性, reg 属性用于描述片选索引, compatible属性用于设备和驱动的匹配&#xff…

【数据结构】树和二叉树堆(基本概念介绍)

🌈个人主页:秦jh__https://blog.csdn.net/qinjh_?spm1010.2135.3001.5343🔥 系列专栏:《数据结构》https://blog.csdn.net/qinjh_/category_12536791.html?spm1001.2014.3001.5482 ​​ 目录 前言 树的概念 树的常见名词 树与…

2024.1.14每日一题

LeetCode 83.删除排序链表中的重复元素 83. 删除排序链表中的重复元素 - 力扣(LeetCode) 题目描述 给定一个已排序的链表的头 head , 删除所有重复的元素,使每个元素只出现一次 。返回 已排序的链表 。 示例 1: 输…

关闭免费版pycharm社区版双击shift时出现的搜索框

Pycharm 在双击 shift 的时候总是弹出搜索框,但作为中国玩家,经常需要双击 shift 循环切换中英文。这就很困恼。 下面就解决这个问题。单独关闭双击shift的功能。 步骤 1.左上角 File -> Settings 2. 如图,输入‘advan’ 找到高级设置&…

RibbonGroup 添加QRadioButton

RibbonGroup添加QRadioButton: QRadioButton * pRadio new QRadioButton(tr("Radio")); pRadio->setToolTip(tr("Radio")); groupClipboard->addWidget(pRadio); connect(pRadio, SIGNAL(clicked(…

扩展卡尔曼滤波(Extended Kalman Filter, EKF):理论和应用

扩展卡尔曼滤波(Extended Kalman Filter, EKF):理论、公式和应用 引言 卡尔曼滤波是一种广泛应用于估计动态系统状态的技术,但当系统的动态模型或测量模型是非线性的时候,传统的卡尔曼滤波方法就显得无能为力。扩展卡…

【保姆级教程|YOLOv8添加注意力机制】【1】添加SEAttention注意力机制步骤详解、训练及推理使用

《博主简介》 小伙伴们好,我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源,可关注公-仲-hao:【阿旭算法与机器学习】,共同学习交流~ 👍感谢小伙伴们点赞、关注! 《------往期经典推…

SpringBoot+thymeleaf实战遇到的问题

目录 一、控制台: 二、数据库查询异常: 三、前后端错误校验 四、在serviceImp中需要添加一个eq条件,表示和数据库中的哪个字段进行比较,否则会查出所有数据,导致500 五、使用流转换数据更简洁 六、重复报错&…

动态规划篇-03:打家劫舍

198、打家劫舍 状态转移方程 base case 边界问题就是:走到最后一间房子门口也没抢,那么最终抢到的金额为0 明确状态 “原问题和子问题中会变化的变量” 抢到的金额数就是状态,因为随着在每一件房子门口做选择,抢到的金额数会随…

大模型训练营Day3 基于 InternLM 和 LangChain 搭建你的知识库 作业

本篇记录大模型训练营第三次的作业,属实是拖延症本症患者。 主要步骤前面的安装各种包和依赖如前面作业一样,按照文档操作即可: 再按照文档进行各种克隆,把知识库复制到本地: 复制粘贴操作文档中的构建向量数据库的文…

七:Day08_任务调度

第一章 定时任务概述 在项目中开发定时任务应该一种比较常见的需求,在 Java 中开发定时任务主要有三种解决方案:一是使用JDK 自带的 Timer,二是使用 Spring Task,三是使用第三方组件 Quartz。 建议: 单体项目架构使用…

基于51单片机的智能热水器设计

需要全部文件请私信关注我!!! 基于51单片机的智能热水器设计 摘要一、绪论1.1 选题背景及意义1.2 完成目标与功能设计 二、硬件系统设计2.1 硬件完成要求2.2 方案选择2.3 电源电路设计2.4 键盘电路2.5 蜂鸣器报警电路2.6 温度检测电路2.7 红…

数学建模.斯皮尔曼相关系数

一、两种定义 二、用matlab计算 三、两种相关系数计算结果的对比 四、取检验值(临界值)分为两种情况 (1)小样本查表 (2)大样本 P值是大于检验值的概率 本文是学习清风网课后的总结,希望对大家有…

1000以内的质数,用python获取放到list1中,1000以内的斐波那契数,用python获取放到list2中,然后两个list画出曲线图

# -*- coding: utf-8 -*- import matplotlib.pyplot as plt # 获取1000以内的质数 def get_primes(n): primes [] for possiblePrime in range(2, n 1): # 假设数是质数 isPrime True for num in range(2, int(possiblePrime ** 0.5) 1): if possiblePrime % num …

数据结构排序——计数排序和排序总结(附上912. 排序数组讲解)

数据结构排序——计数排序和排序总结 现在常见算法排序都已讲解完成,今天就再讲个计数排序。再总结一下 文章目录 1.计数排序2.排序总结3.排序oj(排序数组)题目详情代码思路 1.计数排序 计数排序是一种非基于比较的排序算法,它通…

STL标准库与泛型编程(侯捷)笔记2

STL标准库与泛型编程(侯捷) 本文是学习笔记,仅供个人学习使用。如有侵权,请联系删除。 参考链接 Youbute: 侯捷-STL标准库与泛型编程 B站: 侯捷 - STL Github:STL源码剖析中源码 https://github.com/SilverMaple/STLSourceCo…