如何按键或值对Python字典进行排序

在本教程中,您将学习如何通过键或值对Python字典进行排序。

当您在Python中使用字典时,有时您需要对其内容进行排序 – 按键或按值排序。由于Python字典是键值映射,您将创建一个需要按键或值排序的新字典。

在本教程中,我们将首先回顾Python字典的基础知识。然后,我们将学习如何创建一个按键或值排序的新字典。

Python字典基础知识,回顾

什么是Python字典?

字典是Python中的内置数据结构。它将项目存储为键值对。您可以使用键来查找相应的值。由于键唯一地标识值,因此键不应重复。

py_dict = {"Python":"cool!","Learn":True}
py_dict["Python"]
# 输出: cool!

py_dict["Learn"]
# 输出: True

从功能上讲,字典类似于哈希映射。因此,它不一定是一个有序的数据结构。只要您知道键,就可以以任意顺序访问字典的内容。

字典中项目的顺序

在Python的早期版本中,您必须使用一个OrderedDict来保留键的顺序。但是,从Python 3.7开始,您可以按添加到字典中的相同顺序访问项目。

现在您已经学习了Python字典的基础知识,让我们学习如何创建按键排序的字典的副本。

⚙️注意:您需要使用Python 3.7或更高版本才能正常运行本教程中的代码。您可以下载latest version of Python,或在Geekflare Online Python Editor中运行示例。

如何按键对Python字典进行排序

看一下咖啡馆甜点菜单的下面这张图片。有两列对应菜单项和它们的价格。

您可以通过将项目的名称收集为键和其价格收集为值的方式将其表示为Python字典。

让我们继续创建字典desserts,如下所示。

desserts = {
    "Ice cream":10,
    "Brownies":12,
    "Cheesecake":3,
    "Swiss roll":5,
    "Cookies":4,
    "Cup cake":2
}

接下来,让我们创建一个字典sorted_desserts,其中甜点按字母顺序排列。在原始的desserts字典中,甜点的名称是键。因此,您应该按字母顺序对这些键进行排序以创建一个新的字典。

如何访问Python字典的键

为此,我们首先获取字典的键,然后按字母顺序对它们进行排序。

在Python中,您可以使用内置的字典方法.keys()获取字典中所有键的列表。

让我们调用.keys()方法在dessert字典上检索键,如下所示。

keys = desserts.keys()
print(keys)

#输出
['Ice cream', 'Brownies', 'Cheesecake', 'Swiss roll', 'Cookies', 
'Cup cake']

使用带有列表参数的Python内置sorted()函数调用将返回一个新的排序列表。

接下来,让我们使用列表keys作为参数调用sorted()函数,并将排序后的列表存储在变量sorted_keys中。

sorted_keys = sorted(keys)
print(sorted_keys)

# 输出
['Brownies', 'Cheesecake', 'Cookies', 'Cup cake', 'Ice cream', 'Swiss roll']

现在我们已经按字母顺序对键进行了排序,我们可以从desserts字典中查找与sorted_keys中的键相对应的值,如下所示。

sorted_desserts = {}
for key in sorted_keys:
  sorted_desserts[key] = desserts[key]

print(sorted_desserts)

# 输出
{'Brownies': 12, 'Cheesecake': 3, 'Cookies': 4, 'Cup cake': 2, 
'Ice cream': 10, 'Swiss roll': 5}

让我们对上述代码块进行扩展:

  • sorted_desserts初始化为空Python字典。
  • 循环遍历键列表sorted_keys
  • 对于sorted_keys中的每个键,在desserts字典中查找相应的值,并将条目添加到sorted_desserts中。

在Python中,使用这种方式的for循环被认为是冗长的。在Python中,使用字典推导有一个更简洁的替代方法。

Python中的字典推导

Python支持使用字典推导,类似于list comprehension。字典推导让你可以用一行代码创建一个新的Python字典。

▶️ 这是在Python中使用字典推导的一般结构。

# 1. 当你有两个列表list1和list2,分别代表键和值时
new_dict = {key:value for key,value in zip(list1,list2)}

# 2. 当你只有键,并且可以查找值时
new_dict = {key:value for key in }

让我们在上面的代码块中使用第二种结构:new_dict = {key:value for key in }来创建一个sorted_desserts字典。

在这个例子中:

  • iterable:列表sorted_keys
  • key:通过循环遍历sorted_keys访问的键
  • value:从desserts字典中查找与键对应的值,desserts[key]

将所有这些放在一起,我们有字典推导的表达式,如下所示。

sorted_desserts = {key:desserts[key] for key in sorted_keys}
print(sorted_desserts)

{'Brownies': 12, 'Cheesecake': 3, 'Cookies': 4, 'Cup cake': 2, 
'Ice cream': 10, 'Swiss roll': 5}

从上面的输出中,可以看到甜点按字母顺序排列在sorted_desserts字典中。

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

接下来,我们将学习如何按字典的值对Python字典进行排序。

desserts字典中,值对应于甜点的价格。您可能希望按价格对字典进行排序,无论是按升序还是降序。

▶️ 您可以使用内置的字典方法.items()来获取所有的键值对。每个元组都是一个键值对。

desserts.items()

dict_items([('Ice cream', 10), ('Brownies', 12), ('Cheesecake', 3), 
('Swiss roll', 5), ('Cookies', 4), ('Cup cake', 2)])

每个项本身都是一个元组。因此,您也可以索引到每个键值对,以个别访问键和值。

dict_items = desserts.items()
for item in dict_items:
  print(f"key:{item[0]},value:{item[1]}")

# 输出
key:Ice cream,value:10
key:Brownies,value:12
key:Cheesecake,value:3
key:Swiss roll,value:5
key:Cookies,value:4
key:Cup cake,value:2

由于我们希望按值排序,所以我们将使用上述方法来获取键值对中索引为1的值。

如何按升序对Python字典的值进行排序

这次,我们将使用sorted()函数以及可选的key参数。key可以是任何Python函数,内置函数,用户定义的函数,甚至是一个lambda function

注意:在Python中定义lambda函数的语法是lambda args: expression

在这个按价格排序甜点的例子中,我们可以访问字典项(键-值对)。我们将key = lambda item:item[1]设置为希望按照值(价格)排序。

由于sorted()函数默认返回一个列表,所以你需要将其显式转换为一个dict,如下所示。

sorted_desserts = dict(sorted(desserts.items(), key=lambda item:item[1]))
print(sorted_desserts)

{'杯子蛋糕': 2, '芝士蛋糕': 3, '饼干': 4, '瑞士卷': 5, 
'冰淇淋': 10, '布朗尼': 12}

你也可以使用之前讨论过的dictionary comprehension来重写。

sorted_desserts = {key:value for key, value in sorted(desserts.items(), 
key=lambda item:item[1])}

print(sorted_desserts)

# 输出结果
{'杯子蛋糕': 2, '芝士蛋糕': 3, '饼干': 4, '瑞士卷': 5, 
'冰淇淋': 10, '布朗尼': 12}

sorted_desserts中,价格为$2的杯子蛋糕是第一项,价格为$12的布朗尼是最后一项。

如何按降序排序Python字典的值

如果你想按降序排序价格,可以将可选的reverse参数设置为True,如下所示。

sorted_desserts = dict(sorted(desserts.items(), key=lambda item:item[1], 
reverse=True))
print(sorted_desserts)

# 输出结果
{'布朗尼': 12, '冰淇淋': 10, '瑞士卷': 5, '饼干': 4, 
'芝士蛋糕': 3, '杯子蛋糕': 2}

现在,sorted_desserts已按价格降序排序,以最昂贵的甜点布朗尼为起点,售价为$12。

总结 👩🏽‍💻

让我们快速总结一下在本教程中学到的内容。

  • Python字典以键-值对的形式存储数据;键应该是唯一的。
  • 在按键或值对字典进行排序的过程中,我们创建一个按需排序的新字典。
  • 你可以使用内置的字典方法.keys().items()分别检索所有的键和键-值对。
  • 你可以使用sorted()函数以及可选参数keyreverse来实现所需的排序。

现在你已经学会了如何对Python字典进行排序,学习sort Python lists吧。Happy coding!🎉

类似文章