每天一个python段子(3):一句话创建倒排索引
0x00 前言
现在有一个字典,需要使用value去索引key。就是把{key: value}这样的字典转换成{value: key},即可达到目的。
0x01 基本概念
正向索引(forward index)
一个普通的字典就是正向索引,正反向是相对的。我们常用的索引格式可以称为正向索引。
比如,水果店的水果要按照种类,给出颜色,这样可以方便设计师根据颜色布置水果的区域,好的布局可以吸引顾客。
具体的数据结构如下:
fruit_color_map ={'apple': 'red','banana': 'yellow','watermelon': 'green','grape': 'purple'
}
反向索引(inverted index)
如果提到倒排索引,有些同学应该会更熟悉,然而LZ并不喜欢倒排索引这个翻译。倒排这个词更像是逆序的同义词,然而字典一般情况下是没有顺序的,而且inverted index跟顺序关系不大。
还是举水果店的例子。
LZ隔几天就回去水果店买水果。不幸的是,LZ有选择困难症,看着各种各样的水果名就眼晕。于是,就跟水果店老板提建议,如果给我可选的颜色,LZ就不会这么纠结了。
于是就有了反向索引的数据结构:
color_fruit_map ={'red': 'apple','yellow': 'banana','green': 'watermelon','purple': 'grape'
}
0x02 一句话翻转
场景一: 1 对 1
python 2.7 版本
color_fruit_map = {v: k for k, v in fruit_color_map.iteritems()}
python 3 版本
color_fruit_map = {v: k for k, v in fruit_color_map.items()}
场景二: 1 对 多
有时候value可能不是一个值,而是一个列表。
fruit_color_map ={'apple': ['red', 'yellow1', 'green1'],'banana': ['yellow2'],'watermelon': ['green2', 'black'],'grape': ['purple']
}
python 2.7 版本
color_fruit_map = {x: k for k, v in fruit_color_map.iteritems() for x in v }
python 3 版本
color_fruit_map = {x: k for k, v in fruit_color_map.items() for x in v }
倒排索引的效果:
color_fruit_map = {"green1": "apple", "green2": "watermelon", "purple": "grape", "yellow2": "banana", "yellow1": "apple", "black": "watermelon", "red": "apple"
}
0x03 问题
在场景二中,可以看到LZ把green分成列green1,和green2。原因很简单,如果green不区分的话,在变成key的时候只会保留一个green,那么apple或者watermelon会丢失其中之一,造成丢数据的问题。
解决丢数据的方法就是,在创建反向索引时,创建列表,append重复的值即可。由于一句话无法表达,LZ这里就不写了。实现起来很简单哈。
0x04 小结
- 倒排索引在处理数据中经常用到,通常一句话就能实现反转,so cool
- 本文中用到了 二层字典推导试, 第一个for是源,生成的key可以给第二个for使用,顺序需要牢记
0x05 参考文献
https://stackoverflow.com/questions/483666/python-reverse-invert-a-mapping
每天一个python段子(3):一句话创建倒排索引相关推荐
- 每天一个python段子(2):一句话http服务器
0x00 Python版本: python2 ipv4 python -m SimpleHTTPServer 8080 ipv6 python -c "import socket,Socke ...
- python怎么新建工程_pycharm新建一个python工程步骤
小编最近由于工作原因要用到python,一门新的知识需要接触,对于我来说难度还是很大的. python工程目录结构 每次创建一个python工程 PyCharm会创建如下目录 创建时会把python运 ...
- python全局变量在哪创建_python设置全局变量
python中怎么定义全局变量 复制代码 count = 0 def Fuc(count): print count count += 1 for i in range(0, 10): Fuc(cou ...
- python入门004~创建属于自己的第一个python3项目~基础知识的讲解
上一节带领大家成功的安装了pthon3,并且在开发者工具pycharm里配置了python,这一节就开始带领大家学习python3的基础知识了. 如果你还没有安装python3,也没有安装开发者工具p ...
- python 元类工厂模式_Python进阶丨如何创建你的第一个Python元类?
摘要:通过本文,将深入讨论Python元类,其属性,如何以及何时在Python中使用元类. Python元类设置类的行为和规则.元类有助于修改类的实例,并且相当复杂,是Python编程的高级功能之一. ...
- 如何创建你的第一个Python元类?
Python元类设置类的行为和规则.元类有助于修改类的实例,并且相当复杂,是Python编程的高级功能之一.通过本文,将深入讨论Python元类,其属性,如何以及何时在Python中使用元类.本文介绍 ...
- Python进阶丨如何创建你的第一个Python元类?
摘要:通过本文,将深入讨论Python元类,其属性,如何以及何时在Python中使用元类. Python元类设置类的行为和规则.元类有助于修改类的实例,并且相当复杂,是Python编程的高级功能之一. ...
- 第一个程序(python)-helloworld_创建第一个python程序:‘Hello World!’
安装好python解释器就可以创建第一个仪式程序Helloworld了 1.Python程序的3种运行方式 1.1.Python解释器直接运行 在Windows或者Linux命令行输入python,进 ...
- python做的游戏放到微信_【1、 创建一个python的文件,运行后,文字版方式模拟微信游戏“跳一跳?】...
python脚本学习过程推荐 学习流程: 一:打础 1.找到合适的书籍(推荐Python核心编程2Dive into Python),大致读一次,循环啊判,常用类啊,搞懂(太难的跳过) 2.勤练习py ...
最新文章
- 分布式事务之消息补偿解决方案
- easyui datagrid表头 toolbar 固定
- ASP.NET Core 3.0中使用动态控制器路由
- javadocs_不会吸引人的JavaDocs源样本
- androidstudio打包apk 文件_Android 缩小apk体积过程记录
- [BZOJ4066]简单题
- 解决树莓派 no wireless interfaces found问题
- 51单片机程序0到60计数个位逢5和6不显示,十位逢1不显示http://www.51hei.com/bbs/mcu-h24-1.html
- Python 翻译文章 txt文件
- 邓亚萍加盟人民日报社 担任人民搜索一把手
- html弹性布局什么意思,弹性布局display:flex是什么意思
- led指示灯电路图大全(八款led指示灯电路设计原理图详解)
- python模拟登录163邮箱_Python实现模拟登录网易邮箱的方法示例
- 四羧基锌酞菁(ZnC4Pc),Zn-taPc 酞菁类化合物,齐岳生物供应酞菁材料
- centos ifconfig不显示IP地址解决办法之一(亲测有效)
- 366AP微信中可以下载企业包
- 去哪儿VS携程产品分析
- 输入字符串按ASCⅡ大小排序
- i79750h和i510300h差距大不大
- 使用加速器可以提升获取Docker官方镜像的速度
热门文章
- 虚拟机修改服务器时间,ESXI 6.7系统时间不对,影响内部虚拟机时间,修复及修改方法分享...
- angularjs2 mysql_AngularJS2初学小结
- SoundTouch音频处理库的简单使用(音调、音速、声道等等)
- dnf剑魂buff等级上限_DNF体验服:瞎子实测增伤30%+,皮甲成大赢家,轻甲白字双暴和谐...
- 生产可能性边界 凹向原点问题(只是为了保存自己的想法,非相关人员请忽视这篇博客)
- 【读过的书】《平凡的世界》
- perl @inc问题
- 卡牌大师怎么玩_lol10.10版本卡牌大师怎么玩 卡牌天赋出装详解
- 【Linux】打包压缩命令
- InfluxDB 的聚合类函数