字典排序
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了字典排序相关的知识,希望对你有一定的参考价值。
为了能控制一个字典中元素的顺序,需要使用 collections
模块中的 OrderedDict
类。 在迭代操作的时候它会保持元素被插入时的顺序,示例如下:
from collections import OrderedDict def ordered_dict(): d = OrderedDict() d[‘foo‘] = 1 d[‘bar‘] = 2 d[‘spam‘] = 3 d[‘grok‘] = 4 # Outputs "foo 1", "bar 2", "spam 3", "grok 4" for key in d: print(key, d[key])
当你想要构建一个将来需要序列化或编码成其他格式的映射的时候, OrderedDict
是非常有用的。 比如,你想精确控制以JSON编码后字段的顺序,你可以先使用 OrderedDict
来构建这样的数据:
>>> import json >>> json.dumps(d) ‘{"foo": 1, "bar": 2, "spam": 3, "grok": 4}‘ >>>
讨论
OrderedDict
内部维护着一个根据键插入顺序排序的双向链表。每次当一个新的元素插入进来的时候, 它会被放到链表的尾部。对于一个已经存在的键的重复赋值不会改变键的顺序。
需要注意的是,一个 OrderedDict
的大小是一个普通字典的两倍,因为它内部维护着另外一个链表。 所以如果你要构建一个需要大量 OrderedDict
实例的数据结构的时候(比如读取100,000行CSV数据到一个 OrderedDict
列表中去), 那么你就得仔细权衡一下是否使用 OrderedDict
带来的好处要大过额外内存消耗的影响。
怎样在数据字典中执行一些计算操作(比如求最小值、最大值、排序等等)?
prices = { ‘ACME‘: 45.23, ‘AAPL‘: 612.78, ‘IBM‘: 205.55, ‘HPQ‘: 37.20, ‘FB‘: 10.75 }
为了对字典值执行计算操作,通常需要使用 zip()
函数先将键和值反转过来。 比如,下面是查找最小和最大股票价格和股票值的代码:
min_price = min(zip(prices.values(), prices.keys())) # min_price is (10.75, ‘FB‘) max_price = max(zip(prices.values(), prices.keys())) # max_price is (612.78, ‘AAPL‘)
类似的,可以使用 zip()
和 sorted()
函数来排列字典数据:
prices_sorted = sorted(zip(prices.values(), prices.keys())) # prices_sorted is [(10.75, ‘FB‘), (37.2, ‘HPQ‘), # (45.23, ‘ACME‘), (205.55, ‘IBM‘), # (612.78, ‘AAPL‘)]
执行这些计算的时候,需要注意的是 zip()
函数创建的是一个只能访问一次的迭代器。 比如,下面的代码就会产生错误:
prices_and_names = zip(prices.values(), prices.keys()) print(min(prices_and_names)) # OK print(max(prices_and_names)) # ValueError: max() arg is an empty sequence
以上是关于字典排序的主要内容,如果未能解决你的问题,请参考以下文章