杰瑞科技汇

Python中字典如何按值排序?

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

Python中字典如何按值排序?-图1
(图片来源网络,侵删)

当我们谈论“字典排序”时,我们通常不是指改变字典本身的顺序(因为这没有意义),而是指将字典的键、值或键值对提取出来,并按照某种规则排序,然后生成一个新的、有序的数据结构,通常是列表或新的有序字典。

下面我将详细介绍几种最常见的排序场景和方法。


核心方法: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() 的两个参数:

Python中字典如何按值排序?-图2
(图片来源网络,侵删)
  • 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())

Python中字典如何按值排序?-图3
(图片来源网络,侵删)
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 参数,掌握了它们,你就可以应对几乎所有字典排序的需求。

分享:
扫描分享到社交APP
上一篇
下一篇