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