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

介绍

Python 中的字典是将数据存储为键值对的项目集合。 在 Python 3.7 及更高版本中,字典按项目插入的顺序排序。 在早期版本中,它们是无序的。

在本文中,我们将了解如何根据字典包含的值对字典进行排序。

排序字典使用 循环

我们可以在 a 的帮助下对字典进行排序 for 环形。 首先,我们使用 sorted() 函数对字典的值进行排序。 然后我们遍历排序的值,找到每个值的键。 我们将这些键值对按排序顺序添加到新字典中。

请注意: 排序不允许您对字典重新排序。 我们正在一个全新的空字典中编写有序对。

dict1 = {1: 1, 2: 9, 3: 4}
sorted_values = sorted(dict1.values()) 
sorted_dict = {}

for i in sorted_values:
    for k in dict1.keys():
        if dict1[k] == i:
            sorted_dict[k] = dict1[k]

print(sorted_dict)

如果你用 Python 解释器运行它,你会看到:

{1: 1, 3: 4, 2: 9}

现在我们已经了解了如何使用循环进行排序,让我们看看一个更流行的替代方案,它使用 sorted() 功能。

排序字典使用 sorted() 功能

我们之前使用了 sorted() 函数对数组的值进行排序。 当对字典进行排序时,我们可以再传递一个参数给 sorted() 像这样的功能: sorted(dict1, key=dict1.get).

在这里, key 是在比较值进行排序之前在每个元素上调用的函数。 这 get() 字典对象上的方法返回字典键的值。

sorted(dict1, key=dict1.get) 表达式将返回其值按顺序排序的键列表。 从那里,我们可以创建一个新的排序字典:

dict1 = {1: 1, 2: 9, 3: 4}
sorted_dict = {}
sorted_keys = sorted(dict1, key=dict1.get)  

for w in sorted_keys:
    sorted_dict[w] = dict1[w]

print(sorted_dict) 

使用 sorted() 函数减少了我们在使用时必须编写的代码量 for 循环。 但是,我们可以进一步结合 sorted() 功能与 itemgetter() 按值排序字典的更简洁的解决方案。

排序字典使用 操作者 模块和 项目获取器()

operator 模块包括 itemgetter() 功能。 此函数返回一个可调用对象,该对象从一个对象返回一个项目。

例如,让我们使用 itemgetter() 创建一个可调用对象,该对象返回任何字典的值,其键为 2:

import operator

dict1 = {1: 1, 2: 9}
get_item_with_key_2 = operator.itemgetter(2)

print(get_item_with_key_2(dict1))  

每个字典都可以访问 items() 方法。 此函数将字典的键值对作为元组列表返回。 我们可以使用 itemgetter() 函数提取元组的第二个值,即字典中键的值。

排序后,我们可以根据这些值创建字典:

import operator

dict1 = {1: 1, 2: 9, 3: 4}
sorted_tuples = sorted(dict1.items(), key=operator.itemgetter(1))
print(sorted_tuples)  
sorted_dict = {k: v for k, v in sorted_tuples}

print(sorted_dict) 

用更少的努力,我们就有了一个按值排序的字典!

作为 key 参数接受任何函数,我们可以使用 lambda 函数返回字典值,以便对它们进行排序。 让我们看看如何。

使用 Lambda 函数对字典进行排序

Lambda 函数是 Python 中的匿名或无名函数。 我们可以使用 lambda 函数来获取字典项的值,而无需导入 operator 模块 itemgetter(). 如果您想了解有关 lambda 的更多信息,可以在我们的指南中阅读它们 Python 中的 Lambda 函数.

查看我们的 Git 学习实践指南,其中包含最佳实践、行业认可的标准以及随附的备忘单。 停止谷歌搜索 Git 命令,实际上 学习 它!

让我们使用 lambda 函数按值对字典进行排序 key 的论点 sorted():

dict1 = {1: 1, 2: 9, 3: 4}
sorted_tuples = sorted(dict1.items(), key=lambda item: item[1])
print(sorted_tuples)  
sorted_dict = {k: v for k, v in sorted_tuples}

print(sorted_dict)  

请注意,到目前为止我们讨论的方法仅适用于 Python 3.7 及更高版本。 让我们看看我们可以为早期版本的 Python 做些什么。

返回具有排序值的新字典

按值对字典进行排序后,要在 3.7 之前的 Python 版本中保留已排序的字典,您必须使用 OrderedDict – 可在 collections 模块。 这些对象是保持插入顺序的字典。

这是一个排序和使用的例子 OrderedDict:

import operator
from collections import OrderedDict

dict1 = {1: 1, 2: 9, 3: 4}
sorted_tuples = sorted(dict1.items(), key=operator.itemgetter(1))
print(sorted_tuples)  

sorted_dict = OrderedDict()
for k, v in sorted_tuples:
    sorted_dict[k] = v

print(sorted_dict)  

结论

本教程展示了如何根据字典的值对字典进行排序。 我们首先使用两个 for 循环对字典进行排序。 然后我们通过使用 sorted() 功能。 我们也看到了 itemgetter() 从功能 operator 模块可以使我们的解决方案更加简洁。

最后,我们调整了我们的解决方案以适用于低于 3.7 的 Python 版本。

的变化 sorted() 函数是按值对字典进行排序的最流行和最可靠的方法。

时间戳记:

更多来自 堆栈滥用