位置: IT常识 - 正文

巧用Python字典处理索引统计(python 字典中的字典)

编辑:rootadmin

推荐整理分享巧用Python字典处理索引统计(python 字典中的字典),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:python字典x in d,python 字典怎么用,python 字典,python 字典用法,python 字典用法,python字典x in d,python 字典怎么用,python 字典中的字典,内容如对您有帮助,希望把文章链接给更多的朋友!

索引引擎的基本工作原理便是倒排索引, 即将一个文档所包含的文字反过来映射至文档; 这方面算法并没有太多花样可言, 为了增加效率, 索引数据尽可往内存里面搬。

而基本思路举个简单例子, 现在有以下文档 (分词已经完成) 以及其包含的关键词:

doc_a:[word_w,word_x,word_y]doc_b:[word_x,word_z]doc_c:[word_y]

将其变换为

word_w->[doc_a]word_x->[doc_a,doc_b]word_y->[doc_a,doc_c]word_z->[doc_b]

写成 Python 代码, 便是

doc_a={'id':'a','words':['word_w','word_x','word_y']}doc_b={'id':'b','words':['word_x','word_z']}doc_c={'id':'c','words':['word_y']}docs=[doc_a,doc_b,doc_c]indices=dict()fordocindocs:forwordindoc['words']:ifwordnotinindices:indices[word]=[]indices[word].append(doc['id'])printindices

不过这里有个小技巧, 就是对于判断当前词是否已经在索引字典里的分支

ifwordnotinindices:indices[word]=[]巧用Python字典处理索引统计(python 字典中的字典)

可以被 dict 的 setdefault(key, default=None) 接口替换. 此接口的作用是, 如果 key 在字典里, 那么好说, 拿出对应的值来; 否则, 新建此 key , 且设置默认对应值为 default . 但从设计上来说, 我不明白为何 default 有个默认值 None , 看起来并无多大意义, 如果确要使用此接口, 大体都会自带默认值吧, 如下

fordocindocs:forwordindoc['words']:indices.setdefault(word,[]).append(doc['id'])

这样就省掉分支了, 代码看起来少很多.

不过在某些情况下, setdefault 用起来并不顺手: 当 default 值构造很复杂时, 或产生 default 值有副作用时, 以及一个之后会说到的情况; 前两种情况一言以蔽之, 就是 setdefault 不适用于 default 需要惰性求值的场景. 换言之, 为了兼顾这种需求, setdefault 可能会设计成

defsetdefault(self,key,default_factory):ifkeynotinself:self[key]=default_factory()returnself[key]

倘若真如此, 那么上面的代码应改成

fordocindocs:forwordindoc['words']:indices.setdefault(word,list).append(doc['id'])

不过实际上有其它替代方案, 这个最后会提到.

如果说上面只是一个能预见但实际上可能根本不会遇到的 API 缺陷, 那么下面这个就略打脸了.

考虑现在要进行词频统计, 即一个词在文章中出现了多少次, 如果直接拿 dict 来写, 大致是

defword_count(words):count=dict()forwordinwords:count.setdefault(word,0)+=1returncountprintword_count(['hiiragi','kagami','hiiragi','tukasa','yosimizu','kagami'])

当你兴致勃勃地跑起上面代码时, 代码会以迅雷不及掩脸之势把异常甩到你鼻尖上 --- 因为出现在 += 操作符左边的 count.setdefault(word, 0) 在 Python 中不是一个左值. 怎样, 现在开始念叨 C艹 类型体系的好了吧.

因为 Python 把默认的字面常量 {} 等价于 dict() 就认为 dict 是银弹的思想是要不得的; Python 里面各种数据结构不少, 解决统计问题, 理想的方案是 collections.defaultdict 这个类. 下面的代码想必看一眼就明白

fromcollectionsimportdefaultdictdoc_a={'id':'a','words':['word_w','word_x','word_y']}doc_b={'id':'b','words':['word_x','word_z']}doc_c={'id':'c','words':['word_y']}docs=[doc_a,doc_b,doc_c]indices=defaultdict(list)fordocindocs:forwordindoc['words']:indices[word].append(doc['id'])printindicesdefword_count(words):count=defaultdict(int)forwordinwords:count[word]+=1returncountprintword_count(['hiiragi','kagami','hiiragi','tukasa','yosimizu','kagami'])

完满解决了之前遇到的那些破事.

本文链接地址:https://www.jiuchutong.com/zhishi/310268.html 转载请保留说明!

上一篇:电脑学习网首发最强MacBook苹果笔记本macos电脑应用Sublime Text 4代码编辑器最新4134版本-破解(学电脑网站)

下一篇:英文好书推荐(更新ing)(英文好书推荐)

  • matepad10.4支持手写笔吗(matepad10.4)

    matepad10.4支持手写笔吗(matepad10.4)

  • 苹果11清理运行的软件如何操作(苹果11清理运行内存怎么清理)

    苹果11清理运行的软件如何操作(苹果11清理运行内存怎么清理)

  • 钉钉能不能看见在干什么(钉钉能不能看见学生在玩别的)

    钉钉能不能看见在干什么(钉钉能不能看见学生在玩别的)

  • 华为畅享10充电指示灯怎么设置(华为畅享10充电器多少瓦)

    华为畅享10充电指示灯怎么设置(华为畅享10充电器多少瓦)

  • vivo丢了手机如何确定手机位置(vivo手机丢了该怎么办)

    vivo丢了手机如何确定手机位置(vivo手机丢了该怎么办)

  • 打印店可以打印手机里的照片吗(打印店可以打印照片吗)

    打印店可以打印手机里的照片吗(打印店可以打印照片吗)

  • ipad7上市时间(苹果ipad7是哪一年上市的)

    ipad7上市时间(苹果ipad7是哪一年上市的)

  • 腾讯会议的扬声器是什么(腾讯会议的扬声器怎么关)

    腾讯会议的扬声器是什么(腾讯会议的扬声器怎么关)

  • 移动机顶盒找不到u盘(移动机顶盒找不到了怎么办)

    移动机顶盒找不到u盘(移动机顶盒找不到了怎么办)

  • 退换货的旺旺名是什么(退货写上购物旺旺名字是什么意思)

    退换货的旺旺名是什么(退货写上购物旺旺名字是什么意思)

  • 为什么手机屏幕有暗影(为什么手机屏幕会触控失灵)

    为什么手机屏幕有暗影(为什么手机屏幕会触控失灵)

  • 网线四根和八根区别(网线四根和八根怎么接一起)

    网线四根和八根区别(网线四根和八根怎么接一起)

  • 虎牙直播金豆怎么提现(虎牙直播金豆怎么换成虎牙币)

    虎牙直播金豆怎么提现(虎牙直播金豆怎么换成虎牙币)

  • 小米8移动4g 是什么意思(小米八是四g还是五g)

    小米8移动4g 是什么意思(小米八是四g还是五g)

  • iqoopro怎么设置全局搜索(iqoopro怎么设置通话背景)

    iqoopro怎么设置全局搜索(iqoopro怎么设置通话背景)

  • type c快充什么意思(type c接口快充)

    type c快充什么意思(type c接口快充)

  • 华为荣耀手机怎么分屏(华为荣耀手机怎么恢复出厂设置)

    华为荣耀手机怎么分屏(华为荣耀手机怎么恢复出厂设置)

  • 千牛动态评分几点更新(千牛店铺评分更新时间)

    千牛动态评分几点更新(千牛店铺评分更新时间)

  • word格式选项卡在哪(word格式选项卡在哪里)

    word格式选项卡在哪(word格式选项卡在哪里)

  • 小米m1810e5a是什么型号(小米m1803e1a是什么手机)

    小米m1810e5a是什么型号(小米m1803e1a是什么手机)

  • 货拉拉叫车要先付款吗(货拉拉叫车先支付费钱,会退吗)

    货拉拉叫车要先付款吗(货拉拉叫车先支付费钱,会退吗)

  • 字处理平均成绩怎么算(字处理中的平均成绩怎么算)

    字处理平均成绩怎么算(字处理中的平均成绩怎么算)

  • 腾讯课堂下载的视频在哪个文件夹(腾讯课堂app下载安装)

    腾讯课堂下载的视频在哪个文件夹(腾讯课堂app下载安装)

  • 移动如何修改手机服务密码(移动怎么修改)

    移动如何修改手机服务密码(移动怎么修改)

  • 苹果macOS 11 Big Sur 公测版值得升级吗?macOS Big Sur beta升级详解(苹果客服人工24小时)

    苹果macOS 11 Big Sur 公测版值得升级吗?macOS Big Sur beta升级详解(苹果客服人工24小时)

  • 5.OpenCV图像拼接(opencv拼接图片)

    5.OpenCV图像拼接(opencv拼接图片)

  • 新企业所得税季初资产总额
  • 本年利润需要毎月转入未分配利润吗
  • 一般纳税人简易计税可以抵扣进项税额吗
  • 外汇结汇成人民币违法吗
  • 收到投资款怎么做账
  • 建筑企业预收款开具不征税发票为什么要预缴
  • 发生销售折让时为什么不冲减成本
  • 会计凭证保管的含义及要求
  • 城市生活垃圾处理收费管理办法
  • 非居民企业所得税
  • 过路费占运费比例
  • 加了一年的油
  • 未收到增值税专用发票怎么处理
  • 当月没有认证的发票要勾选吗
  • 固定资产丢失收据怎么写
  • 增值税发票收款人和复核人可以一个人吗
  • 非正常损失的购进货物进项税不能抵扣
  • 前期认证相符且本期申报抵扣怎么填
  • 免税发票上税率是多少
  • 商品退回顺丰代收怎么办
  • 微型小型车
  • 公司清算实收资本是零吗
  • win10双系统修改名称
  • 公司委托第三方缴纳社保合法吗
  • php 面向对象
  • php stream_get_meta_data返回值
  • 在php中,字符串有哪些表示形式
  • 企业为员工提供服务要交增值税吗
  • 建筑施工企业关键技术岗位八大员配置要求
  • 汇付的注意事项有哪些内容
  • 超支福利费按什么计提
  • php精彩编程200例
  • 营改增后企业一般纳税人认定标准为
  • 其他业务支出属于什么会计科目
  • php判断字符串是否合法日期
  • 企业代扣代缴个人所得税会计分录
  • php读取txt文件内容并判断
  • 承兑汇票到期超过10天怎么办
  • php resizeimage 部分jpg文件 生成缩略图失败的原因分析及解决办法
  • thinkphp with
  • 人工智能会影响经济发展吗
  • javaweb项目登录页面不跳转
  • vue里的for循环
  • 中国烟草资产负债表
  • phpcms v9 getshell
  • 应纳税所得额调整金额怎么算
  • 支付招聘网站费用怎么入账
  • 现金销售收入是什么意思
  • 如何核算小企业成本
  • 职工福利费的比例
  • 应交税金及附加怎么计算
  • 红冲暂估原材料如何做会计分录
  • 建设期收到罚单怎么处罚
  • 固定资产是每月折旧吗
  • 企业改制后如何脱离原主管部门
  • mysql 报错1045
  • win10如何利用镜像安装系统
  • win8系统怎么设置密码
  • 如何查看电脑端口号
  • 系统用户在哪里
  • xp系统修复怎么操作
  • 微软状态
  • win7蓝屏0x000000d1
  • 怎么把喜欢的图片设置成电脑壁纸
  • 左手linux+gdb,右手unity+vs,一个bit一个bit地去调试是种什么体验
  • js中的filter方法和map方法
  • android下拉刷新上拉加载
  • android去掉状态栏第三方图标
  • jquery input checked
  • python 任务 调度 管理
  • 如何利用工具人
  • 安卓数据网络
  • android 显示图片
  • javascript精度问题的原因
  • android 屏幕适配方案
  • 企业购置房屋需要交哪些税费
  • 网上申报纳税小程序是啥
  • 天津2020年契税征收标准
  • 开普通发票必须要纳税人识别号吗?
  • 北京市平谷区有地铁吗?
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设