[Python]dict字典排序事例

19 篇文章 0 订阅
12 篇文章 0 订阅

事例一: 单字典排序

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

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 公众号:魔都吴所谓
有什么问题后台留言

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

魔都吴所谓

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值