zoukankan      html  css  js  c++  java
  • 如何根据字典中值的大小,对字典中的项进行排序?

    需求:
    某班英语成绩,存储为
    {'lilei':78,
    'jim':88,
    'mike':99}
    如何根据成绩高低计算学生排名?

    思路:
    将字典中的各项转化为元组,使用内置函数sorted进行排序
    方法一:将字典中的项转换成值在前,键在后的元组。(列表解析,或zip)
    方法二:传递sorted函数的key参数

    代码:

    方法一:
    In [22]: (3,2) > (1,4)
    Out[22]: True
    
    In [23]: (3,2) > (3,4)
    Out[23]: False
    
    In [24]: from random import randint
    
    In [25]: { k: randint(60,100) for k in 'abcdefg'}
    Out[25]: {'a': 62, 'b': 69, 'c': 64, 'd': 82, 'e': 94, 'f': 93, 'g': 70}
    
    In [26]: d = { k: randint(60,100) for k in 'abcdefg'}
    
    In [27]: d
    Out[27]: {'a': 66, 'b': 68, 'c': 65, 'd': 70, 'e': 88, 'f': 80, 'g': 89}
    
    In [28]: [(v,k) for k,v in d.items()]
    Out[28]: [(66, 'a'), (68, 'b'), (65, 'c'), (70, 'd'), (88, 'e'), (80, 'f'), (89, 'g')]
    
    In [29]: l = [(v,k) for k,v in d.items()]
    
    In [30]: l
    Out[30]: [(66, 'a'), (68, 'b'), (65, 'c'), (70, 'd'), (88, 'e'), (80, 'f'), (89, 'g')]
    
    In [31]: sorted(l)
    Out[31]: [(65, 'c'), (66, 'a'), (68, 'b'), (70, 'd'), (80, 'f'), (88, 'e'), (89, 'g')]
    
    In [32]: sorted(l,reverse=True)
    Out[32]: [(89, 'g'), (88, 'e'), (80, 'f'), (70, 'd'), (68, 'b'), (66, 'a'), (65, 'c')]
    
    In [33]: zip([1,2,3],[4,5,6])
    Out[33]: <zip at 0x7f1293b27448>
    
    In [34]: list(zip([1,2,3],[4,5,6]))
    Out[34]: [(1, 4), (2, 5), (3, 6)]
    
    In [35]: list(zip(d.values(),d.keys()))
    Out[35]: [(66, 'a'), (68, 'b'), (65, 'c'), (70, 'd'), (88, 'e'), (80, 'f'), (89, 'g')]
    
    方法二:
    In [36]: d.items()
    Out[36]: dict_items([('a', 66), ('b', 68), ('c', 65), ('d', 70), ('e', 88), ('f', 80), ('g', 89)])
    
    In [38]: sorted(d.items(),key = lambda item:item[1],reverse=True)
    Out[38]: [('g', 89), ('e', 88), ('f', 80), ('d', 70), ('b', 68), ('a', 66), ('c', 65)]
    
    In [39]: p = sorted(d.items(),key = lambda item:item[1],reverse=True)
    
    In [40]: p
    Out[40]: [('g', 89), ('e', 88), ('f', 80), ('d', 70), ('b', 68), ('a', 66), ('c', 65)]
    
    In [41]: d
    Out[41]: {'a': 66, 'b': 68, 'c': 65, 'd': 70, 'e': 88, 'f': 80, 'g': 89}
    
    # 将名次信息更新到 字典中In [2]: from random import randint
    
    In [3]: d = { k: randint(60,100) for k in 'abcdefg'}
    
    In [4]: d
    Out[4]: {'a': 86, 'b': 66, 'c': 80, 'd': 82, 'e': 87, 'f': 89, 'g': 95}
    
    In [5]: sorted(d.items(),key = lambda item:item[1],reverse=True)
    Out[5]: [('g', 95), ('f', 89), ('e', 87), ('a', 86), ('d', 82), ('c', 80), ('b', 66)]
    
    In [6]: p = sorted(d.items(),key = lambda item:item[1],reverse=True)
    
    In [7]: p
    Out[7]: [('g', 95), ('f', 89), ('e', 87), ('a', 86), ('d', 82), ('c', 80), ('b', 66)]
    
    In [8]: enumerate(p)
    Out[8]: <enumerate at 0x7fe3d27d73f0>
    
    In [9]: list(enumerate(p))
    Out[9]: 
    [(0, ('g', 95)),
     (1, ('f', 89)),
     (2, ('e', 87)),
     (3, ('a', 86)),
     (4, ('d', 82)),
     (5, ('c', 80)),
     (6, ('b', 66))]
    
    In [10]: list(enumerate(p,1))
    Out[10]: 
    [(1, ('g', 95)),
     (2, ('f', 89)),
     (3, ('e', 87)),
     (4, ('a', 86)),
     (5, ('d', 82)),
     (6, ('c', 80)),
     (7, ('b', 66))]
    
    In [11]: for i,(k,v) in enumerate(p,1):
        ...:     print(i,k,v)
        ...: 
    1 g 95
    2 f 89
    3 e 87
    4 a 86
    5 d 82
    6 c 80
    7 b 66
    
    In [12]: for i,(k,v) in enumerate(p,1):
        ...:     d[k] = (i,v)
        ...: 
        ...: 
    
    In [13]: d
    Out[13]: 
    {'a': (4, 86),
     'b': (7, 66),
     'c': (6, 80),
     'd': (5, 82),
     'e': (3, 87),
     'f': (2, 89),
     'g': (1, 95)}
    
    In [14]: {k:(i,v) for i,(k,v) in enumerate(p,1)}
    Out[14]: 
    {'g': (1, 95),
     'f': (2, 89),
     'e': (3, 87),
     'a': (4, 86),
     'd': (5, 82),
     'c': (6, 80),
     'b': (7, 66)}
    
    
  • 相关阅读:
    Windows phone 墓碑机制的一些源码
    关于Image一些比较抽象的东西(Build Type与 同步以及异步加载的差异)
    自定义控件之Button控件的自定义
    Java集合最全解析,学集合,看这篇就够用了!!!
    看完让你彻底搞懂Websocket原理
    别人的前途我不敢决定
    花一年的时间让自己过得像个人样
    开篇
    你看得懂吗?
    反思
  • 原文地址:https://www.cnblogs.com/Richardo-M-Q/p/13898011.html
Copyright © 2011-2022 走看看