python - 如何根据字典的第一个和第二个值对字典进行排序?
问题描述
我有这个字典列表,它们已经根据第一个值进行了排序。我如何继续根据它的第二个值对该列表进行排序?
这是我的字典列表:
[{'P3': [7, 117]}, {'P8': [14, 88]}, {'P2': [19, 102]}, {'P4': [19, 95]}]
期望的结果:
[{'P3': [7, 117]}, {'P8': [14, 88]}, {'P4': [19, 95]}, {'P2': [19, 102]}]
我正在用 Python 完成最短作业优先调度任务。每个键(进程)的第一个值是 cpu 爆发,第二个值是到达时间,所以我需要 P4 在 P2 之前走,因为它的到达时间首先出现并且它们具有相同的 cpu 爆发。
解决方案
对于初学者,如果您只想使用列表值对字典列表进行排序,可以使用如下的一行 python 代码:
d = [{'P3': [7, 117]}, {'P8': [14, 88]}, {'P2': [19, 102]}, {'P4': [19, 95]}] # assign the dictionary value
sort_by_first = sorted(d, key=lambda x: list(x.values()))
输出:
[{'P3': [7, 117]}, {'P8': [14, 88]}, {'P4': [19, 95]}, {'P2': [19, 102]}]
sorted()
python中的函数接受可选的关键字参数key
,您可以在其中传递一个自定义函数来查找键,我刚刚制作了一个lambda函数,它将按字典d
的值列表对字典列表进行排序list(x.values())
在python列表比较结果如下:
In [1]: [19, 95] < [19, 102]
Out[1]: True
In [2]: [19, 95] < [19, 95]
Out[2]: False
In [3]: [19, 95] < [19, 5]
Out[3]: False
更新:
lambda 函数可以替换为lambda x: next(iter(x.values()))
where 而不是 typecasting value from dict_values
is extracted as per this answer。
推荐阅读
- openssl - 在 bash 中使用 PBKDF2 和 openssl 而不是 php
- c# - C#:如何将嵌套结构从 C 转换为 C#?
- linux - 在标准输入上传输数据时,调用 ausearch 的脚本表现不同
- javascript - Javascript获取仅使用某些属性过滤的对象数组
- python - 如何检查熊猫数据框是否仅包含数字列?
- php - 如何从子函数返回父函数值
- c - 如何将 C void* 指针转换为指向结构的指针(将结构定义为字符串)?
- visual-studio - 未在 URL 中取消引用 Visual Studio 2015 webtest 上下文参数
- grails-orm - 为什么我在 Micronaut Gorm 应用程序中查阅数据时会收到错误消息?
- arangodb - 如何在 arangodb 中运行一系列 AQL 查询