有序字典与字典是一样的功能,只不过它保持插入字典的顺序,当需要遍历时会先访问最先插入的项。
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)])
由于普通的字典不保留插入的顺序,导致普通字典在使用在排序方面记录数据存在比较大困难,因此可以使用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 深圳