任务
你想对字典排序。这可能意味着需要先根据字典的键排序,然后再让对应值也处于同样的顺序。
解决方案
最简单的方法可以通过这样的描述来概括:先将键排序,然后由此选出对应值:
def sortedDictValues(adict):keys = adict.keys()keys.sort()return [adict[key] for key in keys]
讨论
排序的概念仅仅适用于那些有顺序的集——换句话说,一个序列。而一个映射,比如字典,是没有顺序的,因此它无法被排序。然而,“我怎么才能将一个字典排序”是Python 邮件列表中一个很常见的问题,理论上这个问题没有什么意义。在绝大多数情况下,其实际目的是将字典中的键构成的序列排序。
至于实现部分,一些人总是考虑更复杂的方式,但其实解决方案中给出的最简单的方法也是最快的方法(对 Python 来说,这样的情况并不少见)。在Python 2.3中,在函数的最后的 return 语句中,将列表推导转换成对 map 的调用还可以获得一些速度的提升,大约 20%。比如:
return map(adict.get,keys)
解决方案中的代码在 Python 2.4 下已经比 Python2.3要快了,按照上面的方式进行改写也不会获得很大的速度提升。而使用其他方法,比如用adict.__getitem__来代替adict.get,并不会提供任何性能的提升,反而会引起性能的些微下降,无论是在Python2.3 还是 2.4 中。