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

Python字典排序方法详解

本教程将深入探讨如何在Python中,依据键或值对字典进行排序。你将了解到如何根据自己的需求,重新组织字典的数据。

在Python编程中,字典是一种常用的数据结构。有时候,我们需要依据字典中的键或值对其内容进行排序。由于Python字典是键值对的映射,所以通常是通过创建一个新的字典来实现排序,新字典中的键或值会按照我们期望的顺序排列。

本教程将首先回顾Python字典的基础概念,然后详细讲解如何创建新的字典,使其内容按照键或值的顺序进行排序。

重新认识Python字典

什么是Python字典?

字典是Python内置的数据结构之一,它以键值对的形式存储数据。你可以使用键来查找对应的值。每个键都必须是唯一的,不能重复,以此确保能够准确地找到对应的值。

py_dict = {"Python":"很棒!","学习":True}
py_dict["Python"]
# 输出: 很棒!

py_dict["学习"]
# 输出: True

从功能上看,字典类似于哈希映射。它的元素并不一定是有序排列的。但是,只要你知道键,你就可以按照任何顺序访问字典的内容。

字典中元素的顺序

在较早的Python版本中,为了保持键的顺序,你需要使用有序字典。但是,从Python 3.7开始,字典会按照元素被添加到字典中的顺序来存储它们。这意味着你可以按照添加的顺序访问字典的元素。

现在,你已经掌握了Python字典的基本知识,接下来让我们一起学习如何创建字典的排序副本。

⚙️ 注意:本教程中的代码示例需要Python 3.7或更高版本才能正常运行。你可以下载最新版本的Python,或者在techblik.com的在线Python编辑器中运行这些示例。

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

假设一家咖啡馆的甜点菜单如下图所示。菜单上有两列,一列是甜点的名称,另一列是它们对应的价格。

你可以使用Python字典来表示这个菜单,其中甜点的名称作为键,它们的价格作为值。

让我们创建一个名为`desserts`的字典,来表示这个甜点菜单,代码如下:

desserts = {
    "冰淇淋":10,
    "布朗尼":12,
    "芝士蛋糕":3,
    "瑞士卷":5,
    "曲奇":4,
    "杯子蛋糕":2
}

现在,我们来创建一个新的字典`sorted_desserts`,其中的甜点按照字母顺序排列。在原始的`desserts`字典中,甜点的名称是键。因此,你需要按照字母顺序对这些键进行排序来创建新的字典。

如何访问Python字典的键

为了实现这个目标,我们首先需要获取字典的所有键,然后对它们进行排序。

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

让我们在`desserts`字典上调用`.keys()`方法来获取键,代码如下:

keys = desserts.keys()
print(keys)

#输出
['冰淇淋', '布朗尼', '芝士蛋糕', '瑞士卷', '曲奇', '杯子蛋糕']

通过将这个列表作为参数传递给Python内置的`sorted()`函数,你会得到一个新的排序后的列表。

现在,让我们以键的列表作为参数调用`sorted()`函数,并将排序后的列表存储在变量`sorted_keys`中。

sorted_keys = sorted(keys)
print(sorted_keys)

# 输出
['冰淇淋', '布朗尼',  '杯子蛋糕', '曲奇', '瑞士卷', '芝士蛋糕']

现在,我们已经按照字母顺序对键进行了排序。我们可以使用`sorted_keys`中的键,在`desserts`字典中查找对应的值,代码如下:

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

print(sorted_desserts)

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

让我们详细解释一下上面的代码:

  • 首先,将`sorted_desserts`初始化为空的字典。
  • 然后,遍历排序后的键列表`sorted_keys`。
  • 对于`sorted_keys`中的每一个键,我们在`desserts`字典中查找对应的值,并将其添加到`sorted_desserts`字典中。

使用for循环虽然能够实现排序,但在Python中,使用字典推导式可以更简洁地完成相同的任务。

Python中的字典推导式

Python支持使用字典推导式,类似于列表推导式。字典推导式让你只用一行代码就可以创建一个新的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`字典。

在这个例子中:

  • 可迭代对象:列表`sorted_keys`
  • key:我们通过`sorted_keys`循环访问的键
  • value:从`desserts`字典中查找`key`对应的值,即`desserts[key]`

综上所述,我们得到了以下字典推导式的表达式:

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

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

从上面的输出可以看出,`sorted_desserts`字典中的甜点是按照名称的字母顺序排列的。

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

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

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

▶️ 你可以使用内置的字典方法`.items()`来获取所有的键值对。每一个键值对都会以元组的形式存储。

desserts.items()

#输出
dict_items([('冰淇淋', 10), ('布朗尼', 12), ('芝士蛋糕', 3), ('瑞士卷', 5), ('曲奇', 4), ('杯子蛋糕', 2)])

每个键值对本身就是一个元组。你可以通过索引访问元组中的键和值。

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

# 输出
键:冰淇淋,值:10
键:布朗尼,值:12
键:芝士蛋糕,值:3
键:瑞士卷,值:5
键:曲奇,值:4
键:杯子蛋糕,值:2

因为我们想要按照值来排序,所以我们需要使用上面的方法来获取键值对中索引为1的值。

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

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

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

在这个按照价格对甜点进行排序的示例中,我们需要访问字典中的元素(键值对)。我们将`key`设置为`lambda item:item[1]`,因为我们想按照值(价格)进行排序。

因为`sorted()`函数默认返回一个列表,所以你需要将其显式地转换为字典,如下所示:

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

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

你也可以使用我们之前介绍过的字典推导式,代码如下:

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()`函数以及可选参数`key`和`reverse`来实现所需的排序方式。

既然你已经学习了如何对Python字典进行排序,接下来可以学习如何对Python列表进行排序。编码愉快!🎉