每天一个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 小结

  1. 倒排索引在处理数据中经常用到,通常一句话就能实现反转,so cool
  2. 本文中用到了 二层字典推导试, 第一个for是源,生成的key可以给第二个for使用,顺序需要牢记

0x05 参考文献

https://stackoverflow.com/questions/483666/python-reverse-invert-a-mapping

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值