如何在 Python 中按值对字典进行排序?

2023-09-21 10:30:57

在 Python 中,dictionary类没有任何对其对象中的项目进行排序的规定。因此,必须使用其他一些数据结构(例如list)才能执行排序。

首先,我们的测试数据遵循具有学生姓名和标记的字典对象。

dict类有items()返回tuples列表视图的方法,每个元组都有字典中每对的键和值。

markdict={"Tom":67, "Tina": 54, "Akbar": 87, "Kane": 43, "Divya":73}
marklist=list(markdict.items())
print(marklist)

输出:

[('Tom', 67), ('Tina', 54), ('Akbar', 87), ('Kane', 43), ('Divya', 73)]

该列表允许就地重新排列其项目。我们可以采用简单的气泡排序来根据mark分量排列元组,如下所示。

markdict={"Tom":67, "Tina": 54, "Akbar": 87, "Kane": 43, "Divya":73}
l=len(marklist)
for i in range(l-1):
    for j in range(i+1,l):
        if marklist[i][1]>marklist[j][1]:
            t=marklist[i]
            marklist[i]=marklist[j]
            marklist[j]=t
    sortdict=dict(marklist)
    print(sortdict)

输出:

{'Kane': 43, 'Tina': 54, 'Tom': 67, 'Divya': 73, 'Akbar': 87}

使用 sorted() 方法(Using sorted() Method)

可以理解的是,此解决方案速度慢且效率低下。Python 的内置函数库以 sorted() 函数的形式对此有更好的解决方案。

markdict = {"Tom":67, "Tina": 54, "Akbar": 87, "Kane": 43, "Divya":73}
marklist = sorted(markdict.items(), key=lambda x:x[1])
sortdict = dict(marklist)
print(sortdict)

输出:

{'Kane': 43, 'Tina': 54, 'Tushar': 67, 'Divya': 73, 'Amar': 87}

另一种选择是使用与 Python 标准库捆绑在一起的 operator 模块中定义的itemgetter()函数。 itemgetter()函数从其操作数返回可调用对象。

import operator
markdict = {"Tom":67, "Tina": 54, "Akbar": 87, "Kane": 43, "Divya":73}
marklist= sorted(markdict.items(), key=operator.itemgetter(1)) 
sortdict=dict(marklist)
print(sortdict)

输出:

{'Kane': 43, 'Tina': 54, 'Tushar': 67, 'Divya': 73, 'Amar': 87}

最后,我们将使用 dict.items() 方法和 sorted() 函数首先获取(marks, name)元组,然后按marks的排序顺序重建字典。

markdict = {"Tom":67, "Tina": 54, "Akbar": 87, "Kane": 43, "Divya":73}
marklist=sorted((value, key) for (key,value) in markdict.items())
sortdict=dict([(k,v) for v,k in marklist])
print(sortdict)

输出:

{'Kane': 43, 'Tina': 54, 'Tushar': 67, 'Divya': 73, 'Amar': 87}

本文内容总结: