2014-01-23 4 views
1

Мне тяжело писать класс, который должен иметь возможность выполнять итерацию через отсортированный dicitonary. Моя основная проблема заключается в перегрузке. Я не собираюсь сортировать дик.Как сделать отсортированный класс словаря?

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] 

Благодаря Poke и Martijn Pieters, помог мне с этим ответом.

Вы можете увидеть разницу между collections.OrderedDict, dict и SortedDict.

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

Смежные вопросы