讲师中心 微信公众号
AI工具推荐 视频效率加速

python如何对字典按值排序_python字典根据value进行排序的方法

雨宇姑娘_2621

雨宇姑娘_2621

发布时间:2025-09-15 23:06:02

|

868人浏览过

|

来源于php中文网

原创

使用sorted()函数结合lambda表达式可对字典按值排序,返回按键值对排序后的列表,通过key参数指定item[1]为排序依据,reverse控制升降序,支持二次排序与结果转换。

python如何对字典按值排序_python字典根据value进行排序的方法

Python字典本身在设计上是键的集合,通常被认为是无序的(尽管在Python 3.7+版本中,字典会保留插入顺序)。当我们需要“按值排序”一个字典时,实际上我们不是在修改字典本身,而是生成一个按其值排序后的键值对序列,通常是一个列表。核心思路就是利用Python内置的

sorted()
函数,结合
lambda
表达式来指定排序的依据。

解决方案

要让Python字典根据其值进行排序,最直接且常用的方法是使用

sorted()
函数。这个函数可以接受一个可迭代对象,并返回一个新的已排序的列表。对于字典,我们需要对它的
items()
方法返回的键值对进行排序,并使用
key
参数来指定排序的依据是每个键值对中的值。

假设我们有这样一个字典:

grades = {'Alice': 85, 'Bob': 92, 'Charlie': 78, 'David': 92, 'Eve': 88}

如果我们想按成绩(值)从低到高排序,可以这样做:

立即学习“Python免费学习笔记(深入)”;

sorted_grades_asc = sorted(grades.items(), key=lambda item: item[1])
print(sorted_grades_asc)
# 输出:[('Charlie', 78), ('Alice', 85), ('Eve', 88), ('Bob', 92), ('David', 92)]

这里,

grades.items()
会返回一个包含所有键值对的视图对象,例如
dict_items([('Alice', 85), ('Bob', 92), ...])
。
sorted()
函数会遍历这些键值对。
key=lambda item: item[1]
这部分是关键,它告诉
sorted()
函数,在比较每个
item
(也就是
('键', 值)
这样的元组)时,应该以元组的第二个元素(即
item[1]
,也就是值)作为排序的依据。

如果需要从高到低排序,只需添加

reverse=True
参数:

sorted_grades_desc = sorted(grades.items(), key=lambda item: item[1], reverse=True)
print(sorted_grades_desc)
# 输出:[('Bob', 92), ('David', 92), ('Eve', 88), ('Alice', 85), ('Charlie', 78)]

你会发现,输出结果是一个列表,其中每个元素都是一个

('键', 值)
的元组。这是因为字典本身无法被“排序”成一个有序的字典,我们得到的是一个有序的键值对表示。

当字典值重复时,排序结果会怎样?如何实现二次排序(按值再按键)?

在上面的例子中,

Bob
和
David
的成绩都是92分。在默认的排序中,它们出现的顺序可能取决于原始字典的内部哈希顺序,或者Python
sorted()
函数所使用的Timsort算法的稳定性。Timsort是一种稳定排序算法,这意味着如果两个元素的比较结果相等,它们在排序后的相对顺序会保持不变。但在字典
items()
视图中,原始插入顺序会影响它们的相对位置。

很多时候,我们不仅希望按值排序,当值相等时,还希望能有进一步的排序规则,比如按键名排序。这在处理数据时非常常见,能让结果更具确定性和可读性。

实现这种二次排序,只需要稍微调整

lambda
表达式中的
key
参数,让它返回一个元组。Python在比较元组时,会先比较第一个元素,如果相等,再比较第二个元素,以此类推。

假设我们希望先按成绩降序排列,如果成绩相同,则按学生姓名(键)升序排列:

grades_with_dups = {'Alice': 85, 'Bob': 92, 'Charlie': 78, 'David': 92, 'Eve': 88, 'Frank': 92}

# 先按值降序,值相同时再按键升序
sorted_by_value_then_key = sorted(
    grades_with_dups.items(),
    key=lambda item: (-item[1], item[0]) # -item[1] 实现降序,item[0] 实现键的升序
)
print(sorted_by_value_then_key)
# 输出:[('Bob', 92), ('David', 92), ('Frank', 92), ('Eve', 88), ('Alice', 85), ('Charlie', 78)]

这里

key=lambda item: (-item[1], item[0])
是关键。我们将值取负数,这样在默认升序排序时,负数越大(即原值越小)排在前面,从而实现原值的降序排列。如果
-item[1]
相同(即
item[1]
相同),那么就会比较
item[0]
(键),按键的字母顺序进行升序排列。如果你想让键也降序,那就可以写成
(-item[1], -ord(item[0][0]))
或者其他更复杂的逻辑,但通常按键升序更常见。

排序后,如何将结果重新转换为字典?或者只获取排序后的键/值列表?

sorted()
函数返回的是一个列表,其中包含
('键', 值)
这样的元组。在许多场景下,我们可能需要将这个有序的列表转换回一个新的字典,或者仅仅提取出排序后的键或值。

1. 转换回新的字典:

在Python 3.7+版本中,字典会保留插入顺序。这意味着我们可以直接将排序后的键值对列表传递给

dict()
构造函数,来创建一个新的、按值排序的字典。

python学习
python学习

Python 编程学习助手 skill,面向零基础用户。 当用户表达以下意图时触发: - 学习 Python 基础概念(变量、数据类型、循环、函数、类等) - 请求 Python 练习题或测验 - 请求审查或调试 Python 代码 - 请求 Python 项目实战指导(爬虫、数据分析、Web 开发等入门项目) - 泛化表述如"教我 Python""我想学编程""Python 怎么写""帮我学 Python" 此 skill

下载
sorted_list = sorted(grades.items(), key=lambda item: item[1])
# sorted_list: [('Charlie', 78), ('Alice', 85), ('Eve', 88), ('Bob', 92), ('David', 92)]

new_ordered_dict = dict(sorted_list)
print(new_ordered_dict)
# 输出:{'Charlie': 78, 'Alice': 85, 'Eve': 88, 'Bob': 92, 'David': 92}

这个

new_ordered_dict
就是一个新的字典,它的键值对是按照我们指定的值的顺序排列的。在旧版本的Python中(3.6及以前),
dict()
构造函数虽然能接受这个列表,但生成的字典依然是无序的。如果你确实需要在旧版本中保持顺序,你需要使用
collections.OrderedDict
。

2. 只获取排序后的键列表:

如果只是想知道哪些键是按值排序后的结果,可以使用列表推导式:

sorted_keys = [item[0] for item in sorted_list]
print(sorted_keys)
# 输出:['Charlie', 'Alice', 'Eve', 'Bob', 'David']

3. 只获取排序后的值列表:

同理,获取排序后的值列表也很简单:

sorted_values = [item[1] for item in sorted_list]
print(sorted_values)
# 输出:[78, 85, 88, 92, 92]

这些方法都非常灵活,可以根据你的具体需求来选择如何处理排序后的结果。

处理大型字典排序时,性能和效率如何考量?有哪些替代方案?

对于大多数日常应用来说,Python内置的

sorted()
函数配合
lambda
表达式来对字典进行排序,其性能表现是相当优秀的。
sorted()
底层使用了Timsort算法,这是一种混合排序算法,对各种实际数据都有很好的适应性,平均和最坏情况的时间复杂度都是O(N log N),其中N是字典中元素的数量。

当你处理的字典包含成千上万甚至几十万个键值对时,

N log N
的复杂度意味着排序操作仍然会非常快。主要的开销可能在于创建
items()
视图和中间的列表对象。不过,Python的C语言实现非常高效,通常这部分开销可以忽略不计。

性能考量点:

  1. 内存占用:
    sorted()
    会创建一个新的列表来存储排序后的键值对,这意味着它会占用额外的内存,与原始字典的元素数量成正比。如果字典非常庞大,这可能是一个需要考虑的因素。
  2. lambda
    的效率:
    lambda
    表达式本身非常轻量级,几乎不会引入额外的性能开销。
  3. 频繁排序: 如果你需要对同一个字典进行非常频繁的排序操作,并且每次排序的条件都不同,那么每次都调用
    sorted()
    会重复计算。

替代方案(或优化思路):

实际上,对于“按值排序字典”这个需求,

sorted(dict.items(), key=lambda...)
几乎是Python中最标准、最高效且最推荐的方法。很少有场景需要完全替代它,但可以从不同的角度考虑:

  1. 数据结构选择: 如果你的核心需求是始终保持数据按某个值有序,并且字典只是你数据结构的一部分,那么可能需要重新评估你的数据结构。例如,你可以使用一个列表来存储自定义对象,每个对象包含键和值,然后对这个列表进行排序。或者,如果只是需要快速访问最大/最小值,

    heapq
    模块可能更合适。

    import heapq
    
    # 找出值最大的N个元素
    top_3_items = heapq.nlargest(3, grades.items(), key=lambda item: item[1])
    print(top_3_items)
    # 输出:[('Bob', 92), ('David', 92), ('Eve', 88)]

    heapq.nlargest
    或
    nsmallest
    在只需要获取前N个或后N个元素时,比完整排序更高效,时间复杂度为O(N log K),其中K是需要获取的元素数量。

  2. 预处理/缓存: 如果排序结果在一段时间内是稳定的,或者排序条件不经常变化,你可以将排序结果缓存起来,避免重复计算。

  3. C扩展库: 对于极端性能敏感的应用,并且数据量非常庞大,Python的C扩展库(如NumPy或Pandas)可能提供更快的排序能力。但对于简单的字典排序,引入这些库会增加不必要的复杂性。

总的来说,除非你面临的是TB级别的数据,或者有非常严格的毫秒级响应要求,否则坚持使用Python内置的

sorted()
函数,它足够强大和高效,足以应对绝大多数按值排序字典的需求。过度优化往往是徒劳的,重要的是选择最清晰、最Pythonic的解决方案。

热门AI工具

更多
二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

VibeKnow
VibeKnow Hot

一款AI视频创作工具,主要用于全球首个AI知识视频创作平台,文档、文章、网页,一键生成视频,适合需要提升相关任务效率的用户。

UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

相关专题

更多
Python 时间序列分析与预测
Python 时间序列分析与预测

本专题专注讲解 Python 在时间序列数据处理与预测建模中的实战技巧,涵盖时间索引处理、周期性与趋势分解、平稳性检测、ARIMA/SARIMA 模型构建、预测误差评估,以及基于实际业务场景的时间序列项目实操,帮助学习者掌握从数据预处理到模型预测的完整时序分析能力。

340

2025.12.04

Python 数据清洗与预处理实战
Python 数据清洗与预处理实战

本专题系统讲解 Python 在数据清洗与预处理中的核心技术,包括使用 Pandas 进行缺失值处理、异常值检测、数据格式化、特征工程与数据转换,结合 NumPy 高效处理大规模数据。通过实战案例,帮助学习者掌握 如何处理混乱、不完整数据,为后续数据分析与机器学习模型训练打下坚实基础。

252

2026.01.31

Python数据分析与Pandas高级实战
Python数据分析与Pandas高级实战

本专题围绕 Python 数据分析展开,系统讲解 Pandas 的高级用法,包括数据清洗、透视表、时间序列分析以及多表合并与分组操作。通过实战案例,帮助开发者掌握高效处理与分析数据的方法,提高数据处理效率与分析能力。

691

2026.04.13

lambda表达式
lambda表达式

Lambda表达式是一种匿名函数的简洁表示方式,它可以在需要函数作为参数的地方使用,并提供了一种更简洁、更灵活的编码方式,其语法为“lambda 参数列表: 表达式”,参数列表是函数的参数,可以包含一个或多个参数,用逗号分隔,表达式是函数的执行体,用于定义函数的具体操作。本专题为大家提供lambda表达式相关的文章、下载、课程内容,供大家免费下载体验。

1051

2023.09.15

python lambda函数
python lambda函数

本专题整合了python lambda函数用法详解,阅读专题下面的文章了解更多详细内容。

345

2025.11.08

Python lambda详解
Python lambda详解

本专题整合了Python lambda函数相关教程,阅读下面的文章了解更多详细内容。

574

2026.01.05

C++ Lambda 表达式与函数式编程
C++ Lambda 表达式与函数式编程

深入讲解 C++ Lambda 表达式与函数式编程范式,涵盖 Lambda 基础语法与返回值推导、值捕获与引用捕获的区别与陷阱、初始化捕获(C++14 广义捕获)、泛型 Lambda(auto 参数)、mutable 关键字修改捕获变量、std::function 类型擦除与函数包装、std::bind 参数绑定(及其被 Lambda 替代的趋势)、Lambda 在 STL 算法(sort/transform/for_each/remo

729

2026.05.06

Java 函数式接口与 Lambda 进阶技巧
Java 函数式接口与 Lambda 进阶技巧

在 Java Stream 基础之上进一步深入函数式编程,涵盖 @FunctionalInterface 注解与自定义函数式接口设计、四种方法引用(静态/实例/对象/构造器)的使用场景、Lambda 中的 effectively final 变量捕获规则、函数组合(andThen/compose)与柯里化技巧、Comparator 链式比较器构建、CompletableFuture 异步函数式编排、Reactor / RxJava 响应

428

2026.05.08

Vite 项目如何打包和部署
Vite 项目如何打包和部署

Vite项目打包部署专题汇集生产构建、产物预览、输出目录、资源路径、Nginx与GitHub Pages部署及常见白屏和路由404问题的已审核文章,帮助读者完成上线流程。

20

2026.10.28

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Uvicorn官方安装与入门手册
Uvicorn官方安装与入门手册

共0课时 | 0人学习

Python uv官方项目管理指南
Python uv官方项目管理指南

共0课时 | 0人学习

Python uv官方安装与入门文档
Python uv官方安装与入门文档

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn