You are here:  Home » Python » OrderedDict对象-collections- 容器数据类型(31)Python语言(必读进阶学习教程)(参考资料)

有序词典就像常规词典一样,但它们记住了项目的插入顺序。迭代有序字典时,将按照首次添加键的顺序返回项目。

class collections.OrderedDictitems 
返回一个dict子类的实例,支持通常的dict 方法。一个OrderedDict是记住的键首先被插入的顺序的字典。如果新条目覆盖现有条目,则原始插入位置保持不变。删除条目并重新插入它将使其移至最后。

3.1版中的新功能。

popitemlast = True 
popitem()有序字典的方法返回并删除(键,值)对。如果last为真,则以LIFO顺序返回对,如果为false,则以FIFO顺序返回 。
move_to_endkeylast = True 
将现有移动到有序字典的任一端。该项目被移动到右端,如果最后是真(默认),或一开始,如果最后一个是假的。KeyError如果密钥不存在则引发:

>>>
>>> d = OrderedDict.fromkeys('abcde')
>>> d.move_to_end('b')
>>> ''.join(d.keys())
'acdeb'
>>> d.move_to_end('b', last=False)
>>> ''.join(d.keys())
'bacde'

 

版本3.2中的新功能。

除了通常的映射方法之外,有序字典还支持使用反向迭代reversed()

OrderedDict对象之间的等式测试是对顺序敏感的,并且实现为list(od1.items())==list(od2.items())OrderedDict对象和其他 Mapping对象之间的等式测试对常规字典顺序不敏感。这允许OrderedDict在使用常规字典的任何地方替换对象。

改变在3.5版本:该物品,钥匙,和值的观点 的OrderedDict,现在支持使用反向迭代reversed()

在版本3.6中更改:接受PEP 468,保留了传递给OrderedDict构造函数及其update() 方法的关键字参数的顺序。

OrderedDict例子和食谱

由于有序字典会记住其插入顺序,因此它可以与排序结合使用以生成排序字典:

>>>
>>> # 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)])

 

删除条目时,新排序的词典会保持其排序顺序。但是,当添加新密钥时,密钥将附加到末尾,并且不会保留排序。

创建一个有序的字典变体也很简单,它可以记住上次插入密钥的顺序。如果新条目覆盖现有条目,则原始插入位置将更改并移至结尾:

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类组合,以便计数器记住首次遇到的订单元素:

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),)