在 Python 中,对字典进行排序是一个常见的需求,需要明确的是,Python 的字典本身是无序的(在 Python 3.7 之前),但从 Python 3.7 开始,字典会保持插入顺序。

当我们谈论“字典排序”时,我们通常不是指改变字典本身的顺序(因为这没有意义),而是指将字典的键、值或键值对提取出来,并按照某种规则排序,然后生成一个新的、有序的数据结构,通常是列表或新的有序字典。
下面我将详细介绍几种最常见的排序场景和方法。
核心方法:sorted() 函数
Python 的 sorted() 函数是所有排序操作的核心,它可以对任何可迭代对象进行排序,并返回一个新的已排序列表。
# sorted() 的基本用法 numbers = [3, 1, 4, 1, 5, 9, 2] sorted_numbers = sorted(numbers) print(sorted_numbers) # 输出: [1, 1, 2, 3, 4, 5, 9]
要对字典进行排序,关键在于使用 sorted() 的两个参数:

iterable: 传入字典的.items(),.keys(), 或.values()。key: 一个函数,用来指定排序的依据。
根据键排序
这是最常见的排序方式之一,通常我们希望按键的字母顺序或数字大小排序。
假设我们有以下字典:
my_dict = {'banana': 3, 'apple': 1, 'pear': 2, 'orange': 4}
获取按键排序后的键值对列表 (元组列表)
使用 sorted(my_dict.items(), key=lambda item: item[0])。
my_dict.items()返回一个包含(key, value)元组的视图对象:dict_items([('banana', 3), ('apple', 1), ...])。key=lambda item: item[0]告诉sorted()函数,使用元组中的第一个元素(也就是键)作为排序的依据。
# 按键的字母顺序升序排序
sorted_by_key_asc = sorted(my_dict.items(), key=lambda item: item[0])
print(sorted_by_key_asc)
# 输出: [('apple', 1), ('banana', 3), ('orange', 4), ('pear', 2)]
# 按键的字母顺序降序排序
sorted_by_key_desc = sorted(my_dict.items(), key=lambda item: item[0], reverse=True)
print(sorted_by_key_desc)
# 输出: [('pear', 2), ('orange', 4), ('banana', 3), ('apple', 1)]
只获取排序后的键列表
使用 sorted(my_dict.keys())。

sorted_keys = sorted(my_dict.keys()) print(sorted_keys) # 输出: ['apple', 'banana', 'orange', 'pear']
根据值排序
当我们需要找出值最大或最小的项时,按值排序非常有用。
继续使用上面的字典:
my_dict = {'banana': 3, 'apple': 1, 'pear': 2, 'orange': 4}
获取按值排序后的键值对列表 (元组列表)
使用 sorted(my_dict.items(), key=lambda item: item[1])。
key=lambda item: item[1]告诉sorted()函数,使用元组中的第二个元素(也就是值)作为排序的依据。
# 按值升序排序
sorted_by_value_asc = sorted(my_dict.items(), key=lambda item: item[1])
print(sorted_by_value_asc)
# 输出: [('apple', 1), ('pear', 2), ('banana', 3), ('orange', 4)]
# 按值降序排序 (最常用)
sorted_by_value_desc = sorted(my_dict.items(), key=lambda item: item[1], reverse=True)
print(sorted_by_value_desc)
# 输出: [('orange', 4), ('banana', 3), ('pear', 2), ('apple', 1)]
只获取排序后的值列表
使用 sorted(my_dict.values())。
sorted_values = sorted(my_dict.values()) print(sorted_values) # 输出: [1, 2, 3, 4]
获取排序后的新字典
如果你希望排序后的结果仍然是一个字典(为了保持顺序以便后续遍历),你可以使用 collections.OrderedDict(Python 3.6及以下版本)或者直接使用字典构造器(Python 3.7+)。
方法 A: 使用字典构造器 (推荐, Python 3.7+)
由于 Python 3.7+ 的字典会保持插入顺序,我们可以直接用 sorted() 返回的列表来创建一个新字典。
my_dict = {'banana': 3, 'apple': 1, 'pear': 2, 'orange': 4}
# 按值降序排序并创建一个新字典
sorted_dict_by_value = dict(sorted(my_dict.items(), key=lambda item: item[1], reverse=True))
print(sorted_dict_by_value)
# 输出: {'orange': 4, 'banana': 3, 'pear': 2, 'apple': 1}
# 遍历这个新字典,你会发现它是有序的
for key, value in sorted_dict_by_value.items():
print(f"{key}: {value}")
# 输出:
# orange: 4
# banana: 3
# pear: 2
# apple: 1
方法 B: 使用 collections.OrderedDict (兼容旧版 Python)
对于 Python 3.6 或更早的版本,你需要使用 collections.OrderedDict 来保证顺序。
from collections import OrderedDict
my_dict = {'banana': 3, 'apple': 1, 'pear': 2, 'orange': 4}
# 按值降序排序并创建一个 OrderedDict
sorted_ordered_dict = OrderedDict(sorted(my_dict.items(), key=lambda item: item[1], reverse=True))
print(sorted_ordered_dict)
# 输出: OrderedDict([('orange', 4), ('banana', 3), ('pear', 2), ('apple', 1)])
高级用法:多级排序
有时我们需要进行更复杂的排序,先按值降序,如果值相同,则按键升序”。
这可以通过修改 key 函数来实现。key 函数可以返回一个元组,Python 会按照元组中的元素顺序依次进行比较。
# 一个包含重复值的字典
complex_dict = {'apple': 10, 'banana': 5, 'cherry': 10, 'date': 5}
# 先按值降序,再按键升序排序
# key=lambda item: (-item[1], item[0])
# -item[1] 是一个技巧,用于实现降序排序(因为 5 < 10,但 -5 > -10)
# item[0] 是在值相同时,按键升序排序
sorted_multi_level = sorted(complex_dict.items(), key=lambda item: (-item[1], item[0]))
print(sorted_multi_level)
# 输出: [('apple', 10), ('cherry', 10), ('banana', 5), ('date', 5)]
| 排序目标 | 代码示例 | 输出结果类型 |
|---|---|---|
| 按键升序 (键值对) | sorted(my_dict.items(), key=lambda item: item[0]) |
列表 (元组) |
| 按键降序 (键值对) | sorted(my_dict.items(), key=lambda item: item[0], reverse=True) |
列表 (元组) |
| 按值升序 (键值对) | sorted(my_dict.items(), key=lambda item: item[1]) |
列表 (元组) |
| 按值降序 (键值对) | sorted(my_dict.items(), key=lambda item: item[1], reverse=True) |
列表 (元组) |
| 按键升序 (新字典) | dict(sorted(my_dict.items(), key=lambda item: item[0])) |
字典 (Python 3.7+) |
| 按值降序 (新字典) | dict(sorted(my_dict.items(), key=lambda item: item[1], reverse=True)) |
字典 (Python 3.7+) |
| 多级排序 | sorted(my_dict.items(), key=lambda item: (-item[1], item[0])) |
列表 (元组) |
字典的核心是 sorted() 函数和 key 参数,掌握了它们,你就可以应对几乎所有字典排序的需求。
