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  深圳

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

caimouse

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值