• [Python]dict字典排序事例


    事例一: 单字典排序

    描述:一个字典有多对键值组成,将其按照键进行排序、按照值进行排序等场景,直接看代码:

    a = {'2': 'b', '5': 'e', '1': 'a'}
    print(sorted(a.items(), key=lambda x: x[0], reverse=False))  # 按键排序 小到大
    print(sorted(a.items(), key=lambda x: x[0], reverse=True))  # 按键排序 大到小
    print(sorted(a.items(), key=lambda x: x[1], reverse=False))  # 按值排序 小到大
    print(sorted(a.items(), key=lambda x: x[1], reverse=True))  # 按值排序 大到小
    print(sorted(a.keys(), key=lambda x: x[0], reverse=False))  # 只对键排序 小到大
    print(sorted(a.keys(), key=lambda x: x[0], reverse=True))  # 只对键排序 大到小
    # 结果
    '''
    [('1', 'a'), ('2', 'b'), ('5', 'e')]
    [('5', 'e'), ('2', 'b'), ('1', 'a')]
    [('1', 'a'), ('2', 'b'), ('5', 'e')]
    [('5', 'e'), ('2', 'b'), ('1', 'a')]
    ['1', '2', '5']
    ['5', '2', '1']
    '''
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    上面的多种排序形式都完成了单字典的排序,观察细心的小伙伴想必一定发现了:1.原字典给我们的数据类型都是字典形式;2.我们获取到的结果都是列表嵌套元祖形式;这两点很明显不太符合我们实际的预期,一般场景下都是你给我什么数据类型,我返回给你什么数据类型,鉴于这一点,我们可以将获取到的结果做下简单的数据加工即可,现在单独拿第一个按键排序 小到大为例来单独说下怎么获取到一个字典的结果,具体的代码:
    方法一:中规中矩式

    a = {'2': 'b', '5': 'e', '1': 'a'}
    res = sorted(a.items(), key=lambda x: x[0], reverse=False)
    
    print(res)  # [('1', 'a'), ('2', 'b'), ('5', 'e')]
    res_dict = {}  # 收集结果的空字典
    for i in res:
        res_dict[i[0]] = i[1]
     
    print(res_dict)  # {'1': 'a', '2': 'b', '5': 'e'}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    方法二:一步到位式

    a = {'2': 'b', '5': 'e', '1': 'a'}
    res = sorted(a.items(), key=lambda x: x[0], reverse=False)
    
    print(res)
    print(dict(res))
    '''
    [('1', 'a'), ('2', 'b'), ('5', 'e')]
    {'1': 'a', '2': 'b', '5': 'e'}
    '''
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    这样我们通过上面两种方式都完成了数据类型的转化,优势已经很明显看的出来~~~;

    事例二:列表字典排序

    单条件

    python 中在做排序中会有不少场景涉及到列表字典嵌套相关操作,比如这里有一个学生及其成绩对应的数据:

    [
        {'name': 'zhangsan', 'score': 69},
        {'name': 'lisi', 'score': 89},
        {'name': 'wangwu', 'score': 98},
        {'name': 'wusuowei', 'score': 60},
        {'name': 'zhouliu', 'score': 49},
        {'name': 'tianqi', 'score': 30},
    ]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    这么一串数据按score进行从高到低排序,如何进行排序呢~~~
    品代码:

    s = [
        {'name': 'zhangsan', 'score': 69},
        {'name': 'lisi', 'score': 89},
        {'name': 'wangwu', 'score': 98},
        {'name': 'wusuowei', 'score': 60},
        {'name': 'zhouliu', 'score': 49},
        {'name': 'tianqi', 'score': 30},
    ]
    
    res1 = sorted(s, key=lambda i: i['score'])  # 按score从小到大
    res2 = sorted(s, key=lambda i: i['score'], reverse=False)  # 按score从小到大
    res3 = sorted(s, key=lambda i: i['score'], reverse=True)  # 按score从大到小
    res4 = sorted(s, key=lambda i: -i['score'])  # 按score从大到小
    
    print(res2)
    print(res2)  # 可以看出reverse的默认值就是False
    print(res3)
    print(res4)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    结果:

    [{'name': 'tianqi', 'score': 30}, {'name': 'zhouliu', 'score': 49}, {'name': 'wusuowei', 'score': 60}, {'name': 'zhangsan', 'score': 69}, {'name': 'lisi', 'score': 89}, {'name': 'wangwu', 'score': 98}]
    [{'name': 'tianqi', 'score': 30}, {'name': 'zhouliu', 'score': 49}, {'name': 'wusuowei', 'score': 60}, {'name': 'zhangsan', 'score': 69}, {'name': 'lisi', 'score': 89}, {'name': 'wangwu', 'score': 98}]
    [{'name': 'wangwu', 'score': 98}, {'name': 'lisi', 'score': 89}, {'name': 'zhangsan', 'score': 69}, {'name': 'wusuowei', 'score': 60}, {'name': 'zhouliu', 'score': 49}, {'name': 'tianqi', 'score': 30}]
    [{'name': 'wangwu', 'score': 98}, {'name': 'lisi', 'score': 89}, {'name': 'zhangsan', 'score': 69}, {'name': 'wusuowei', 'score': 60}, {'name': 'zhouliu', 'score': 49}, {'name': 'tianqi', 'score': 30}]
    
    • 1
    • 2
    • 3
    • 4

    多条件

    刚才演示一个按照某一个key进行排序的事例,实际生产过程中难免会遇到按照多个key进行排序的场景,上数据:

    s = [
        {'name': 'zhangsan', 'score': 69, 'age': 18},
        {'name': 'lisi', 'score': 89, 'age': 14},
        {'name': 'wangwu', 'score': 98, 'age': 16},
        {'name': 'wusuowei', 'score': 60, 'age': 17},
        {'name': 'zhouliu', 'score': 49, 'age': 15},
        {'name': 'tianqi', 'score': 30, 'age': 19},
        {'name': 'wangjiu', 'score': 30, 'age': 18},
        {'name': 'qiansan', 'score': 30, 'age': 20},
    ]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    数据解读:
    每一行数据代表一个样本,每一列数据代表一个属性;
    我们先回顾下刚才的事例,按某一个值进行排序,这里举例还按score进行排序,代码:

    res1 = sorted(s, key=lambda i: (i['score']))  # 按score从小到大
    print(res1)
    
    • 1
    • 2

    结果:

    [{'name': 'tianqi', 'score': 30, 'age': 19}, 
    {'name': 'wangjiu', 'score': 30, 'age': 18},
     {'name': 'qiansan', 'score': 30, 'age': 20}, 
     {'name': 'zhouliu', 'score': 49, 'age': 15}, 
     {'name': 'wusuowei', 'score': 60, 'age': 17}, 
     {'name': 'zhangsan', 'score': 69, 'age': 18}, 
     {'name': 'lisi', 'score': 89, 'age': 14}, 
     {'name': 'wangwu', 'score': 98, 'age': 16}]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    很明显看的出来是按照score从小到大进行了排序,但是我们还发现了一个问题就是在出现相同score=30的时候排序就没有规律可言了:
    在这里插入图片描述
    这个结果一般还没处理到最后。还是可以做进一步的数据优化,来完成这一部分排序,让结果显得更有序~~~,那就开始干吧:
    代码:

    res1 = sorted(s, key=lambda i: (i['score'], i['age']))  # 按score从小到大
    
    print(res1)
    
    • 1
    • 2
    • 3

    结果:

    [
    {'name': 'wangjiu', 'score': 30, 'age': 18}, 
    {'name': 'tianqi', 'score': 30, 'age': 19},
    {'name': 'qiansan', 'score': 30, 'age': 20},
    {'name': 'zhouliu', 'score': 49, 'age': 15}, 
    {'name': 'wusuowei', 'score': 60, 'age': 17},
    {'name': 'zhangsan', 'score': 69, 'age': 18}, 
    {'name': 'lisi', 'score': 89, 'age': 14}, 
    {'name': 'wangwu', 'score': 98, 'age': 16}]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    在排序时多做了一个条件过滤:
    在这里插入图片描述
    结果上排序也明显的看的出来:
    在这里插入图片描述
    欢迎关注v x 公众号:魔都吴所谓
    有什么问题后台留言

  • 相关阅读:
    七、stm32-TIM定时器(通用定时器中断)
    基于Jeecgboot前后端分离的ERP系统开发代码生成(二)
    Python---列表 集合 字典 推导式(本文以 字典 为主)
    HTML小游戏2—— 2048网页版(附完整源码)
    Arduino 控制理论(3)- 如何在 Arduino 中调节 PID 控制器
    【ESP8266+TM1650时钟数码管+DS3231模块】制作网络时钟
    奥比中光3D视觉AI开放平台焕新上线,建设AI算力+算法+数据全链路
    深入浅出,SpringBoot整合Quartz实现定时任务与Redis健康检测(一)
    C++基础——引用讲解1
    【一、虚拟机vmware安装】
  • 原文地址:https://blog.csdn.net/qq_41604569/article/details/125459269