Python Cookbook-5.1 对字典排序

任务

你想对字典排序。这可能意味着需要先根据字典的键排序,然后再让对应值也处于同样的顺序。

解决方案

最简单的方法可以通过这样的描述来概括:先将键排序,然后由此选出对应值:

python 复制代码
def sortedDictValues(adict):
	keys = adict.keys()
	keys.sort()
	return [adict[key] for key in keys]

讨论

排序的概念仅仅适用于那些有顺序的集------换句话说,一个序列。而一个映射,比如字典,是没有顺序的,因此它无法被排序。然而,"我怎么才能将一个字典排序"是Python 邮件列表中一个很常见的问题,理论上这个问题没有什么意义。在绝大多数情况下,其实际目的是将字典中的键构成的序列排序。

至于实现部分,一些人总是考虑更复杂的方式,但其实解决方案中给出的最简单的方法也是最快的方法(对 Python 来说,这样的情况并不少见)。在Python 2.3中,在函数的最后的 return 语句中,将列表推导转换成对 map 的调用还可以获得一些速度的提升,大约 20%。比如:

python 复制代码
return map(adict.get,keys)

解决方案中的代码在 Python 2.4 下已经比 Python2.3要快了,按照上面的方式进行改写也不会获得很大的速度提升。而使用其他方法,比如用adict.__getitem__来代替adict.get,并不会提供任何性能的提升,反而会引起性能的些微下降,无论是在Python2.3 还是 2.4 中。

相关推荐
weixin_420947641 天前
php composer update 指定包的分支非tag
开发语言·php·composer
一水鉴天1 天前
整体设计 定稿 之6 完整设计文档讨论及定稿 之4 整体设计数据库设计规范(含两个版本)
开发语言·人工智能·架构
五阿哥永琪1 天前
Spring Boot 权限控制三件套:JWT 登录校验 + 拦截器 + AOP 角色注解实战
java·spring boot·python
Evand J1 天前
【EKF定位滤波例程】三维空间(XYZ)速度与位置观测与滤波(使用扩展卡尔曼滤波EKF),状态量和观测量都是非线性的。附MATLAB例程下载链接
开发语言·matlab
hweiyu001 天前
数据结构:布隆过滤器
数据结构
AM越.1 天前
Java设计模式超详解--观察者设计模式
java·开发语言·设计模式
云上漫步者1 天前
深度实战:Rust交叉编译适配OpenHarmony PC——sys_locale完整适配案例
开发语言·后端·rust
guygg881 天前
基于MATLAB的精密星历内插实现方案
开发语言·matlab
专注VB编程开发20年1 天前
c#语法和java相差多少
java·开发语言·microsoft·c#
cici158741 天前
MATLAB中实现图像超分辨率
开发语言·matlab