python中defaultdict和OrderedDict

在使用Python的字典时,我们发现,当输出字典的内容时,输出内容的顺序和我们建立字典时候添加内容的输入顺序不一致。其

实,我们使用的是python默认的字典,这种字典是不按顺序存储、输出我们添加在字典中的内容的。要想输出内容的顺序和我们建

立字典时候添加内容的输入顺序一致,就要用到有序字典。

一、

defaultdict

使用dict时,如果引用的Key不存在,就会抛出KeyError。如果希望key不存在时,返回一个默认值,就可以用defaultdict:

from collections import defaultdict
dd = defaultdict(lambda: ‘N/A’)
dd[‘key1’] = ‘abc’
dd[‘key1’] # key1存在
‘abc’

dd[‘key2’] # key2不存在,返回默认值
‘N/A’
注意默认值是调用函数返回的,而函数在创建defaultdict对象时传入。

除了在Key不存在时返回默认值,defaultdict的其他行为跟dict是完全一样的。

OrderedDict
使用dict时,Key是无序的。在对dict做迭代时,我们无法确定Key的顺序。

如果要保持Key的顺序,可以用OrderedDict:

from collections import OrderedDict
d = dict([(‘a’, 1), (‘b’, 2), (‘c’, 3)])
d # dict的Key是无序的
{‘a’: 1, ‘c’: 3, ‘b’: 2}

od = OrderedDict([(‘a’, 1), (‘b’, 2), (‘c’, 3)])
od # OrderedDict的Key是有序的
OrderedDict([(‘a’, 1), (‘b’, 2), (‘c’, 3)])
注意,OrderedDict的Key会按照插入的顺序排列,不是Key本身排序:

od = OrderedDict()
od[‘z’] = 1
od[‘y’] = 2
od[‘x’] = 3
od.keys() # 按照插入的Key的顺序返回
[‘z’, ‘y’, ‘x’]
OrderedDict可以实现一个FIFO(先进先出)的dict,当容量超出限制时,先删除最早添加的Key:

from collections import OrderedDict

class LastUpdatedOrderedDict(OrderedDict):

def __init__(self, capacity):
    super(LastUpdatedOrderedDict, self).__init__()
    self._capacity = capacity

def __setitem__(self, key, value):
    containsKey = 1 if key in self else 0
    if len(self) - containsKey >= self._capacity:
        last = self.popitem(last=False)
        print 'remove:', last
    if containsKey:
        del self[key]
        print 'set:', (key, value)
    else:
        print 'add:', (key, value)
    OrderedDict.__setitem__(self, key, value)

你可能感兴趣的:(计算机基础,刷题)