python模塊介紹- collections(5)-OrderedDict 有序字典


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.


原文鏈接:http://blog.csdn.net/oychw/article/details/8817856


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM