• 如何让字典保持有序?


    需求:
    某编程竞赛系统,对参赛选手编程解题进行计时,选手完成题目后,把该选手的解题用时记录到字典中,以便赛后按选手名查看选手成绩
    {'lilei':(2,43),'HanMeiMei':(5,52),'Jim':(1,39)..}
    比赛结束后,需按排名顺序依次打印选手成绩,如何实现?

    思路:
    使用标准库中的collections中的OrderDict
    以OrderDict代替内置字典dict,依次将选手的成绩存入OrderDict
    ps:python3.6中的内置字典已经为有序字典,3.6之前为无序字典

    代码:

    >>> d = {}
    
    >>> d['c'] = 1
    
    >>> d['b'] = 2
    
    >>> d['a'] = 3
    
    >>> d.keys()
    dict_keys(['c', 'b', 'a'])
    
    >>> list(iter(d))
    ['c', 'b', 'a']
    
    >>> from collections import OrderedDict
    
    >>> od = OrderedDict()
    
    >>> od['c'] = 1
    
    >>> od['b'] = 2
    
    >>> od['a'] = 3
    
    >>> od.keys()
    odict_keys(['c', 'b', 'a'])
    
    >>> player = list('abcdefg')
    
    >>> from random import shuffle
    
    >>> shuffle(player)
    
    >>> player
    ['d', 'c', 'f', 'e', 'b', 'a', 'g']
    
    >>> od = OrderedDict()
    
    >>> for i,p in enumerate(player,1):
    ...     od[p] = i
    ... 
    
    >>> od
    OrderedDict([('d', 1),
                 ('c', 2),
                 ('f', 3),
                 ('e', 4),
                 ('b', 5),
                 ('a', 6),
                 ('g', 7)])
    
    >>> def query_by_name(d,name):
    ...     return d[name]
    ... 
    
    >>> query_by_name(od,f)
    ---------------------------------------------------------------------------
    NameError                                 Traceback (most recent call last)
    <ipython-input-67-eb4396f2d4db> in <module>
    ----> 1 query_by_name(od,f)
    
    NameError: name 'f' is not defined
    
    >>> query_by_name(od,'f')
    3
    
    >>> iter(od)[3]
    ---------------------------------------------------------------------------
    TypeError                                 Traceback (most recent call last)
    <ipython-input-69-996216e64316> in <module>
    ----> 1 iter(od)[3]
    
    TypeError: 'odict_iterator' object is not subscriptable
    
    >>> iter(od)[3:5]
    ---------------------------------------------------------------------------
    TypeError                                 Traceback (most recent call last)
    <ipython-input-70-a9879548c137> in <module>
    ----> 1 iter(od)[3:5]
    
    TypeError: 'odict_iterator' object is not subscriptable
    
    >>> from itertools import islice
    
    >>> islice(range(10),3,6)
    <itertools.islice at 0x7f3ae39bb868>
    
    >>> range(10)
    range(0, 10)
    
    >>> iter(range(10))
    <range_iterator at 0x7f3ae3f72a20>
    
    >>> list(range(10))
    [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    
    >>> list(iter(range(10)))
    [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    
    >>> list(islice(range(10),3,6))
    [3, 4, 5]
    
    >>> list(islice(od,3,6))
    ['e', 'b', 'a']
    
    >>> def query_by_order(d,a,b=None):  # 按名次来取,
    ...     a -= 1 # 默认从0开始切片
    ...     if b is None:
    ...         b = a + 1  # 取一个的情况
    ...     return list(islice(od,a,b))
    ... 
    
    >>> od
    OrderedDict([('d', 1),
                 ('c', 2),
                 ('f', 3),
                 ('e', 4),
                 ('b', 5),
                 ('a', 6),
                 ('g', 7)])
    
    >>> query_by_order(od,4)
    ['e']
    
    >>> query_by_order(od,3,6)
    ['f', 'e', 'b', 'a']
    
  • 相关阅读:
    配置caffe matlab 中遇到的坑
    VGGnet论文总结(VERY DEEP CONVOLUTIONAL NETWORKS FOR LARGE-SCALE IMAGE RECOGNITION)
    内核笔记
    VM上安装centos6.x & java & tomcat & mysql
    ----
    python 入门笔记
    centos7 安装 mysql & jetty
    VM 中 CentOS 6 的相关配置
    论文 单词句子笔记
    Android 百度地图开发(三)--- 实现比例尺功能和替换自带的缩放组件
  • 原文地址:https://www.cnblogs.com/Richardo-M-Q/p/13902405.html
Copyright © 2020-2023  润新知