每天一个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 ...
最新文章
- eclipse opengl java_eclipse openGL glut运行环境配置
- docker下gitlab安装配置使用(完整版)
- java构造方法 this_Java中的构造方法this、super的用法详解
- Docker-compose 常用命令
- openEuler Developer Day 启动大会招募环节,报名通道同步开启!
- 启动startUML的时候报错“Exception EOleSysError in module StarUML.exe at 000AD559.
- 常见卫星汇总--期待大神补充下载地址
- Windows XP修改CHM字体大小
- 程序员的简历应该如何写?(含模拟面试,持续更新)
- mysql基于ssm的自习室座位管理系统 毕业设计源码221118
- 磁悬浮框架飞轮磁轴承技术研究与发展现状
- 浙江大学软件学院人工智能保研面经2021
- html游戏让目标人物移动,如何用html5编写鼠标事件与游戏人物移动
- t440p安装黑苹果+win10双系统记录
- HDOJ 5498 Tree
- 图神经网络(五):GAT
- javascript ipz127
- Currency Translation in Bex Query Variable 1
- C语言新建文件写入数据
- 教你如何获取微信公众号历史文章链接
热门文章
- heu acm基础训练之1002
- 优秀程序员的5个特征,你在第几层?
- 查看圆周率 Pi值 Pi的前百位 Pi的前百万位
- aigo MP5 视频输出使用方法
- python简单心形代码爱情闪字_qq主人寄语闪字代码:完整保存你给的爱
- Spring Framework基础知识:依赖注入与面向切面
- DVDFab Photo Enhancer AI (AI图片无损放大软件)官方中文版V1.0.2.3 | 图片无损放大器
- 【转】CNN+BLSTM+CTC的验证码识别从训练到部署
- 如何将AVIF格式转换为JPG格式
- 【转】深度完美GhostXP_SP3快速装机优化版V2011.12