栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

[Python]dict字典排序事例

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

[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.我们获取到的结果都是列表嵌套元祖形式;这两点很明显不太符合我们实际的预期,一般场景下都是你给我什么数据类型,我返回给你什么数据类型,鉴于这一点,我们可以将获取到的结果做下简单的数据加工即可,现在单独拿第一个按键排序 小到大为例来单独说下怎么获取到一个字典的结果,具体的代码:
方法一:中规中矩式

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'}

方法二:一步到位式

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'}
'''

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

事例二:列表字典排序 单条件

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},
]

这么一串数据按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)

结果:

[{'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}]
多条件

刚才演示一个按照某一个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},
]

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

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

结果:

[{'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}]

很明显看的出来是按照score从小到大进行了排序,但是我们还发现了一个问题就是在出现相同score=30的时候排序就没有规律可言了:

这个结果一般还没处理到最后。还是可以做进一步的数据优化,来完成这一部分排序,让结果显得更有序~~~,那就开始干吧:
代码:

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

print(res1)

结果:

[
{'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}]

在排序时多做了一个条件过滤:

结果上排序也明显的看的出来:

欢迎关注v x 公众号:魔都吴所谓
有什么问题后台留言

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/990008.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号