1.3.5 OrderedDict 有序字典
OrderedDict是dict的子類,它記住了內容添加的順序。
import collections
print 'Regular dictionary:'
d = {}
d['a'] = 'A'
d['b'] = 'B'
d['c'] = 'C'
for k, v in d.items():
print k, v
print '\nOrderedDict:'
d = collections.OrderedDict()
d['a'] = 'A'
d['b'] = 'B'
d['c'] = 'C'
for k, v in d.items():
print k, v
執行結果:
# ./collections_ordereddict_iter.py
Regular dictionary:
a A
c C
b B
OrderedDict:
a A
b B
c C
OrderedDict要內容和順序完全相同才會視為相等。
import collections
print 'dict :',
d1 = {}
d1['a'] = 'A'
d1['b'] = 'B'
d1['c'] = 'C'
d2 = {}
d2['c'] = 'C'
d2['b'] = 'B'
d2['a'] = 'A'
print d1 == d2
print 'OrderedDict:',
d1 = collections.OrderedDict()
d1['a'] = 'A'
d1['b'] = 'B'
d1['c'] = 'C'
d2 = collections.OrderedDict()
d2['c'] = 'C'
d2['b'] = 'B'
d2['a'] = 'A'
print d1 == d2
執行結果:
# ./collections_ordereddict_equality.py
dict : True
OrderedDict: False
定義:
class collections.OrderedDict([items])
注意順序以添加順序為准,和修改的順序無關。
特殊方法:OrderedDict.popitem(last=True) 。last為True是LIFO,即為堆棧,反之是FIFO,即為隊列。還支持排序:reversed().
有序字典和有序字典的相等比較,是順序相關的;和其他映射類型比較,是順序無關的。
手冊中的實例:
>>> # regular unsorteddictionary
>>> d = {'banana': 3, 'apple':4,'pear': 1, 'orange': 2}
>>> # dictionary sorted by key
>>> OrderedDict(sorted(d.items(),key=lambda t: t[0]))
OrderedDict([('apple', 4), ('banana', 3),('orange', 2), ('pear', 1)])
>>> # dictionary sorted by value
>>> OrderedDict(sorted(d.items(),key=lambda t: t[1]))
OrderedDict([('pear', 1), ('orange', 2),('banana', 3), ('apple', 4)])
>>> # dictionary sorted bylength of the key string
>>> OrderedDict(sorted(d.items(),key=lambda t: len(t[0])))
OrderedDict([('pear', 1), ('apple', 4),('orange', 2), ('banana', 3)])
如果想根據插入順序排序:
classLastUpdatedOrderedDict(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結合,是Counter記住第一次元素出現的順序。
classOrderedCounter(Counter, OrderedDict):
'Counter that remembers the order elementsare first encountered'
def __repr__(self):
return '%s(%r)' % (self.__class__.__name__,OrderedDict(self))
def __reduce__(self):
return self.__class__, (OrderedDict(self),)
參考資料:
SeeAlso:
collections(http://docs.python.org/library/collections.html) The standard library
documentationfor this module.