实际案例:
某编程竞赛系统,对参赛选手编程解体进行计时,选手完成题目后,吧该选手解体用时记录到字典中,以便赛后按选手名查询成绩
{'Lilei':(2,43),'HanMei':(5,52),'Jim':(1,39)...}
比赛结束后,需按排名顺序依次打印选手成绩, 如何实现?
from collections import OrderedDict # shuffle 洗牌函数, 可以将列表的次序打乱 from random import shuffle ''' 使用标准库 collections 中的 OrderedDict 以 OrderedDict 替代字典 Dict, 依次将选手成绩存入 OrderedDict ''' players = list('abcdefgh') shuffle(players) print(players) # ['c', 'b', 'd', 'a', 'f', 'e', 'h', 'g'] od = OrderedDict() # 简单模拟,排名次序 for i, p in enumerate(players, 1): od[p] = i print(od) # OrderedDict([('b', 1), ('a', 2), ('f', 3), ('c', 4), ('d', 5), ('g', 6), ('h', 7), ('e', 8)]) # 编写接口-根据名字查询成绩 def query_by_name(d, name): # 根据键-取值 return d[name] # 测试 -根据键 取值 --即根据名字-取成绩 print(query_by_name(od, 'c')) print(query_by_name(od, 'b')) ''' 根据 次序-查询 名字, 或者根据 范围, 查询名字 iter(od) 不支持切片和索引操作 在迭代工具 itertoools 中, 引入 islice 进行切片 ''' from itertools import islice # islice 工作原理: 依次迭代前面可迭代对象 # 例子-- 从0开始迭代,范围外的值舍去 isTest = islice(range(10), 3, 6) print(list(isTest)) # [3, 4, 5] isOd = islice(od, 3, 6) print(list(isOd)) # ['e', 'h', 'a'] # 根据排名value,查询键key def query_by_order(d, a, b=None): a -= 1 # 如果只想查询 一个数据 if b is None: # b=a+1,说明只取到a 即(a,a+1) b = a+1 return list(islice(od, a, b)) # 测试 print(query_by_order(od, 4)) print(query_by_order(od, 3, 6)) # ['g'] # ['c', 'g', 'f', 'e']
上述解题思路,基于python3.5
python3.6中,内置字典dict的行为已经与 OrderedDict一致,使用dict即可
但为了代码兼容,建议还是使用 OrderedDict函数进行.