如何让字典保持有序---Python数据结构与算法相关问题与解决技巧
2024-10-07 10:32:25
实际案例:
某编程竞赛系统,对参赛选手编程解体进行计时,选手完成题目后,吧该选手解体用时记录到字典中,以便赛后按选手名查询成绩
{'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函数进行.
最新文章
- jsp中如何判断el表达式中的BigDecimal==0
- centos 7.0 查看内存使用情况 和 查看硬盘使用情况
- 29 GroupSock(NetAddressList)——live555源码阅读(四)网络
- android 开发进阶 自定义控件-仿ios自动清除控件
- LeetCode Binary Tree Level Order Traversal II (二叉树颠倒层序)
- Centos中安装vim
- 修改UILabel的行间距
- 内嵌W5100的网络模块WIZ812MJ--数据手册
- shell变量$(CURDIR),$0,$1,$2,$#含义解释
- Vue的移动端多图上传插件vue-easy-uploader
- Fluent动网格【8】:网格节点运动案例
- Selenium自动化测试,接口自动化测试开发,性能测试从入门到精通
- 【java】之查看JVM参数的值
- Javascript富文本编辑器
- 简单部署iRedMail-0.9.8 - 邮件服务器架构和错误代码
- html5 自带全屏API调用方法
- Alert Messager
- 简单理解C#中的抽象工厂模式是什么概念!
- 1039 Course List for Student
- 用 Apache POI 读取 XLSX 数据