5.3.6 OrderedDict对象

有序字典与字典是一样的功能,只不过它保持插入字典的顺序,当需要遍历时会先访问最先插入的项。

class collections.OrderedDict([items]) 

返回一个新的dict类派生类实例,支持字典的操作方法。

例子:

#python 3.4

import collections

 

d = {'banana': 3, 'apple':4, 'pear': 1, 'orange': 2}

od = collections.OrderedDict(sorted(d.items(), key=lambda t: t[0]))

print(d)

print(od)

结果输出如下:

{'orange': 2, 'banana': 3, 'apple': 4, 'pear': 1}

OrderedDict([('apple', 4), ('banana', 3), ('orange', 2), ('pear', 1)])

 

popitem(last=True) 

这个方法用来删除最后或最先插入的键值对,并返回。如果lastTrue,按后进先出方式把最后插入的项删除,并返回;如果lastFalse,按先进先出的方式删除最先一项,并返回。

例子:

#python 3.4

import collections

 

d = {'banana': 3, 'apple':4, 'pear': 1, 'orange': 2}

od = collections.OrderedDict(sorted(d.items(), key=lambda t: t[0]))

print(od)

od.popitem()

print(od)

od.popitem(False)

print(od)

结果输出如下:

OrderedDict([('apple', 4), ('banana', 3), ('orange', 2), ('pear', 1)])

OrderedDict([('apple', 4), ('banana', 3), ('orange', 2)])

OrderedDict([('banana', 3), ('orange', 2)])

 

move_to_end(key, last=True) 

移动指定的键的项到最后面或最前面。如果last设置为True就移动最右边;如果last设置为False就移动到最左边。

例子:

#python 3.4

import collections

 

d = {'banana': 3, 'apple':4, 'pear': 1, 'orange': 2}

od = collections.OrderedDict(sorted(d.items(), key=lambda t: t[0]))

print(od)

od.move_to_end('apple')

print(od)

od.move_to_end('apple', last = False)

print(od)

结果输出如下:

OrderedDict([('apple', 4), ('banana', 3), ('orange', 2), ('pear', 1)])

OrderedDict([('banana', 3), ('orange', 2), ('pear', 1), ('apple', 4)])

OrderedDict([('apple', 4), ('banana', 3), ('orange', 2), ('pear', 1)])

 

5.3.6.1 OrderedDict例子

由于普通的字典不保留插入的顺序,导致普通字典在使用在排序方面记录数据存在比较大困难,因此可以使用OrderedDict来解决:

例子:

#python 3.4

import collections

 

d = {'banana': 3, 'apple':4, 'pear': 1, 'orange': 2}

od = collections.OrderedDict(sorted(d.items(), key=lambda t: t[0]))

print(od)

od = collections.OrderedDict(sorted(d.items(), key=lambda t: t[1]))

print(od)

od = collections.OrderedDict(sorted(d.items(), key=lambda t: len(t[0])))

print(od)

结果输出如下:

OrderedDict([('apple', 4), ('banana', 3), ('orange', 2), ('pear', 1)])

OrderedDict([('pear', 1), ('orange', 2), ('banana', 3), ('apple', 4)])

OrderedDict([('pear', 1), ('apple', 4), ('banana', 3), ('orange', 2)])

从这个例子里,可以看到通过不同排序方法,可以把普通字典转换到有序字典。

 

如果想要最后插入的元素放在最后,而本身里已经有了一个相关的元素,它并不会删除,也不会移动到最后,而是直接在后面添加新插入的元素,因此可以使用下面的类继承来实现相关的功能:

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类和OrderedDict类组合一个新类:

例子:

#python 3.4

import collections

 

class OrderedCounter(collections.Counter, collections.OrderedDict):

    'Counter that remembers the order elements are first encountered'

 

    def __repr__(self):

        return '%s(%r)' % (self.__class__.__name__, collections.OrderedDict(self))

 

    def __reduce__(self):

        return self.__class__, (collections.OrderedDict(self),)

d = {'banana': 3, 'apple':4, 'pear': 1, 'orange': 2, 'apple':8}

od = OrderedCounter(d)

print(od)

结果输出如下:

OrderedCounter(OrderedDict([('banana', 3), ('pear', 1), ('apple', 8), ('orange', 2)]))

 

蔡军生 QQ:9073204  深圳

你可能感兴趣的:(python,milang)