2014-01-23 114 views
1

我很難寫一個類,它應該能夠遍歷排序的字典。我的主要問題在於iter超負荷。我不知道如何獲得排序。如何創建一個已排序的字典類?

class SortedDict(): 
    def __init__(self, dic = None): 
     self.dic = {} 
     if len(dic) > 0: self.dic = dic; 

    def __iter__(self): 
     self.dic = sorted(self.dic.keys()) 
     self.index = 0 
     return self 

    def next(self): 
     if self.index+1 < len(self.dic): 
      self.index += 1 
      return self.dic.keys()[self.index] 
+3

你需要* *此創建你自己,或者你可以使用['collections.OrderedDict'](http://docs.python.org/2/庫/ collections.html#ordereddict對象)? – jonrsharpe

+2

您正在使用鍵的排序列表覆蓋字典,因此您將丟失值。 – chepner

+0

我需要自己做 – Saphire

回答

4

您不必重新發明輪子。你可以簡單地繼承了dict貫徹SortedDict,這樣

class SortedDict(dict): 
    def __iter__(self): 
     return iter(sorted(super(SortedDict, self).__iter__())) 

    def items(self): 
     return iter((k, self[k]) for k in self) 

    def keys(self): 
     return list(self) 

    def values(self): 
     return [self[k] for k in self] 

感謝PokeMartijn Pieters,幫助我這個答案。

您可以看到collections.OrderedDict,dictSortedDict之間的差異。

a = OrderedDict() 
a["2"], a["1"], a["3"] = 2, 1, 3 
print list(a.items()), a.keys(), a.values() 

b = {} 
b["2"], b["1"], b["3"] = 2, 1, 3 
print list(b.items()), b.keys(), b.values() 

c = SortedDict() 
c["2"], c["1"], c["3"] = 2, 1, 3 
print list(c.items()), c.keys(), c.values() 

輸出

[('2', 2), ('1', 1), ('3', 3)] ['2', '1', '3'] [2, 1, 3] 
[('1', 1), ('3', 3), ('2', 2)] ['1', '3', '2'] [1, 3, 2] 
[('1', 1), ('2', 2), ('3', 3)] ['1', '2', '3'] [1, 2, 3] 
3

既然你願意在點排序開始迭代,所有你需要的是:

def __iter__(self): 
    return iter(sorted(self.dic)) 

__iter__必須返回一個迭代器,以及內置的功能iter()得到一個從排序的鍵列表。工作完成,不需要next()功能。

+0

非常不希望成爲實現已排序字典類所需的全部內容。 – martineau

相關問題