• 如何让字典保持有序---Python数据结构与算法相关问题与解决技巧


       实际案例:

       某编程竞赛系统,对参赛选手编程解体进行计时,选手完成题目后,吧该选手解体用时记录到字典中,以便赛后按选手名查询成绩

      {'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函数进行.

  • 相关阅读:
    根据第三方库spire.pdf使用指定打印机打印pdf文件
    大批量GPS坐标转百度坐标
    maven settings.xml
    linux 权限
    hyper-v 创建ubuntu虚拟机设置静态ip
    mysql 复制
    nginx
    python函数定义
    Mysql索引浅析
    Mysql 数据库锁机制浅析
  • 原文地址:https://www.cnblogs.com/goddog1024/p/11301123.html
Copyright © 2020-2023  润新知