首页 > 解决方案 > 如何根据字典的第一个和第二个值对字典进行排序?

问题描述

我有这个字典列表,它们已经根据第一个值进行了排序。我如何继续根据它的第二个值对该列表进行排序?

这是我的字典列表:

[{'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 爆发。

标签: pythonpython-3.xdictionary

解决方案


对于初学者,如果您只想使用列表值对字典列表进行排序,可以使用如下的一行 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_valuesis extracted as per this answer。


推荐阅读