collections OrderedDict

来源:互联网 发布:线上展厅制作软件 编辑:程序博客网 时间:2024/06/06 03:38

排序字典像正常的字典一样,但是他们能记住元素被插入时的顺序。当迭代一个排序字符时,元素会按顺序返回以他们第一次被加入时的位置

class collections.OrderedDict([items]
返回一个字典子类的实例,支持普字典的方法。排序字典就是一个能记住key第一次被插入时的顺序。如果一个新的入口重写了一个以经存在的入口,原始的插入位置是不会改变的。如果删除一个入口在重新插入,他们移动到最后面

OrderedDict.popitem(last=True)
popitem()对于排序字典来说返回并且删除一个元素

除了通常的映射方法,排序字典支持使用reversed()反转迭代

排序字典之间的相等测试是对位置敏感的,以**list(od1.items()) == list(od2.items())这种方式实现,排序字典和普通映射之间的相等测试是对位置不敏感的像正规的字典一样,这允许使用排序字典替换正常字典的任何地主

排序字典的例子和食谱

因为排序字典能够记住元素插入时的位置。所以他可以与排序结合使用来制造一个排过序的字典

>>> # regular unsorted dictionary>>> d = {'banana': 3, 'apple': 4, 'pear': 1, 'orange': 2}>>> # dictionary sorted by key>>> OrderedDict(sorted(d.items(), key=lambda t: t[0]))OrderedDict([('apple', 4), ('banana', 3), ('orange', 2), ('pear', 1)])>>> # dictionary sorted by value>>> OrderedDict(sorted(d.items(), key=lambda t: t[1]))OrderedDict([('pear', 1), ('orange', 2), ('banana', 3), ('apple', 4)])>>> # dictionary sorted by length of the key string>>> OrderedDict(sorted(d.items(), key=lambda t: len(t[0])))OrderedDict([('pear', 1), ('apple', 4), ('orange', 2), ('banana', 3)])

一个新的排过序的字典维持他们的排序位置当入口被删除时,但是当一个新的key被添加时,新的key会被追回在最后面,排序不会维持

还有一种更直接的方式创建一个排序字典(参记住key最后插入的位置)的另一种版本。如果一个新的入口覆盖了一个已经存在的入口,原始插入的位置会被改变并且移动到最后:

class LastUpdatedOrderedDict(OrderedDict):    'Store items in the order the keys were last added'    def __setitem__(self, key, value):        if key in self:            del self[key]        OrderedDict.__setitem__(self, key, value)

排序字典可以与Counter类结合,这个counter可以记住元素第一次访问时的位置

class OrderedCounter(Counter, OrderedDict):     'Counter that remembers the order elements are first encountered'     def __repr__(self):         return '%s(%r)' % (self.__class__.__name__, OrderedDict(self))     def __reduce__(self):         return self.__class__, (OrderedDict(self),)
0 0