Python中的sorted是内置的排序函数,并非字典特有的方法,它可以对任何可迭代对象进行排序,返回一个新的排序后的列表,不会修改原对象。当我们需要对字典的键、值或者键值对进行排序时,就可以借助sorted函数来实现。

sorted函数的基本语法
sorted函数的基本语法格式如下:
sorted(iterable, key=None, reverse=False)
参数说明:
- iterable:需要排序的可迭代对象,比如字典、列表、元组等。
- key:可选参数,用来指定排序的依据,是一个函数,该函数会作用于可迭代对象的每个元素上,根据返回结果排序。
- reverse:可选参数,布尔类型,默认是False表示升序排序,设置为True表示降序排序。
对字典的键进行排序
字典本身是可迭代对象,直接对字典使用sorted函数,默认会遍历字典的键进行排序,返回排序后的键组成的列表。
# 定义一个示例字典
my_dict = {"c": 3, "a": 1, "b": 2}
# 对字典的键进行升序排序
sorted_keys = sorted(my_dict)
print(sorted_keys) # 输出 ['a', 'b', 'c']
# 对字典的键进行降序排序
sorted_keys_desc = sorted(my_dict, reverse=True)
print(sorted_keys_desc) # 输出 ['c', 'b', 'a']
对字典的值进行排序
如果需要对字典的值进行排序,就需要借助key参数,指定排序依据为字典的值。可以通过dict.get方法或者lambda表达式来获取每个键对应的值作为排序依据。
my_dict = {"c": 3, "a": 1, "b": 2}
# 使用lambda表达式按值升序排序,返回排序后的键列表
sorted_keys_by_value = sorted(my_dict, key=lambda k: my_dict[k])
print(sorted_keys_by_value) # 输出 ['a', 'b', 'c']
# 按值降序排序
sorted_keys_by_value_desc = sorted(my_dict, key=lambda k: my_dict[k], reverse=True)
print(sorted_keys_by_value_desc) # 输出 ['c', 'b', 'a']
# 使用dict.get方法实现同样的效果
sorted_keys_by_get = sorted(my_dict, key=my_dict.get)
print(sorted_keys_by_get) # 输出 ['a', 'b', 'c']
对字典的键值对进行排序
如果需要直接对字典的键值对进行排序,可以先通过items()方法获取字典的键值对视图,再结合sorted函数和key参数进行排序,排序后可以得到排序后的键值对列表,也可以转成新的有序字典。
my_dict = {"c": 3, "a": 1, "b": 2}
# 按键对键值对进行升序排序
sorted_items_by_key = sorted(my_dict.items())
print(sorted_items_by_key) # 输出 [('a', 1), ('b', 2), ('c', 3)]
# 按值对键值对进行升序排序
sorted_items_by_value = sorted(my_dict.items(), key=lambda item: item[1])
print(sorted_items_by_value) # 输出 [('a', 1), ('b', 2), ('c', 3)]
# 将排序后的键值对转成新的字典(Python3.7+ 字典会保持插入顺序)
new_dict = dict(sorted_items_by_value)
print(new_dict) # 输出 {'a': 1, 'b': 2, 'c': 3}
注意事项
- sorted函数返回的是列表,不会修改原字典,如果需要得到排序后的字典,需要手动将排序结果转成字典。
- 当字典的键或者值不是可比较类型时,使用sorted函数会抛出类型错误,比如字典中同时包含字符串和数字的键,直接排序就会报错。
- 如果需要对复杂的嵌套字典进行排序,key参数可以写更复杂的lambda表达式,比如根据嵌套字典的某个字段排序。
# 嵌套字典排序示例
students = {
"stu1": {"name": "张三", "score": 85},
"stu2": {"name": "李四", "score": 92},
"stu3": {"name": "王五", "score": 78}
}
# 按学生分数升序排序,返回排序后的键值对列表
sorted_students = sorted(students.items(), key=lambda item: item[1]["score"])
print(sorted_students)
# 输出 [('stu3', {'name': '王五', 'score': 78}), ('stu1', {'name': '张三', 'score': 85}), ('stu2', {'name': '李四', 'score': 92})]