Python实例:通过字典值反向查询键值的实现方法
一、实际场景
比如百米赛跑,对于每个运动员的用时进行计数,比赛完后把每个运动员的用时记录到字典中,其存储格式如下所示:
{'xiaoliang': (1, 16.9), 'xiaoxin': (1, 11.7), 'xiaowang': (2, 13.8) ......}
正常情况下,我们可以通过Python字典的键值查询值,但是在有的应用场景中我们希望反过来,通过值反向查询键值,即我们不仅像查询某个运动员是第几名,还希望知道谁是第一名,谁是第三名?等等这列查询方式。这对这种实际场景,本文给出其实现方法。
二、通过字典值反向查询键值的实现方法
实现步骤:
- 步骤一:构造一组赛跑运动员字典成绩数据,共有8名运动员,且成绩为均值为12.5,标准差为1.5的正态分布;
- 步骤二:使用
sorted 结合匿名函数lambda方法对运动员数据字典按照成绩排序,然后,使用for循环和内置函数enumerate进行排序后的字典重构。 - 步骤三:构造通过字典值反向查询键值的函数:
query_by_order(dict_data, begin_index, end_index=None) ,其中输入参数的含义: - (1)
dict_data : 需要处理的字典; - (2)
begin_index : 搜索的索引开始位置; - (3)
end_index : 搜索的索引结束位置。 - 由于字典格式数据不支持索引和切片操作,所以这里使用迭代工具包
itertools 中的islice 方法将字典转换可索引和切片操作的字典。针对排好序的运动员字典的操作结果如下图所示:
from random import randint, gauss
from itertools import islice
runners_dict = {'runer_%d' % i: round(gauss(12.5, 1.5), 2)
for i in range(1, 9)}
runners_tuplelist_sorted = sorted(runners_dict.items(),
key=lambda x: x[1])
runners_dict_sorted = {}
for rank, (runner_key, runner_val) in
enumerate(runners_tuplelist_sorted, 1):
runners_dict_sorted[runner_key] = (rank, runner_val)
def query_by_order(dict_data, begin_index, end_index=None):
begin_index = begin_index - 1
if end_index is None:
end_index = begin_index + 1
return list(islice(dict_data, begin_index, end_index))
query_by_order(runners_dict_sorted, 1, 4)
实际输出如下图所示,程序正确运行,并输出正确结果:
|