IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    [原]5.3.6 OrderedDict对象

    caimouse发表于 2016-01-13 20:46:19
    love 0

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

    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) 

    这个方法用来删除最后或最先插入的键值对,并返回。如果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.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  深圳



沪ICP备19023445号-2号
友情链接