设计一个dict的子类,其迭代器将按排序顺序返回其键

时间:2014-02-10 10:03:36

标签: python iterator

这是Python Epiphanies的练习。最初的问题:

  

设计一个dict的子类,其迭代器将返回其键,如   是排序,但按排序顺序,不使用收益

我提出了一个似乎有效的解决方案:

>>> class mydict(dict):
        def __iter__(self):
            self.index = 0
            self.sorted_keys = sorted(self.keys())
            self.it = iter(self.sorted_keys)
            return self
        def __next__(self):
            if self.index < len(self.keys()):
                self.index += 1
                next(self.it)
                return self.sorted_keys[self.index-1]
            else:
                raise StopIteration


>>> d = mydict({2: 1, 4: 5, 3: 7, 1: 2})
>>> dit = iter(d)
>>> next(dit)
1
>>> next(dit)
2
>>> next(dit)
3
>>> next(dit)
4
>>> next(dit)
Traceback (most recent call last):
  File "<pyshell#96>", line 1, in <module>
    next(dit)
  File "<pyshell#89>", line 13, in __next__
    raise StopIteration
StopIteration

由于没有提供标准答案,我只想知道这是否是最佳答案。 谢谢。

3 个答案:

答案 0 :(得分:4)

你可以简单地从这样的__iter__返回一个迭代器,

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

d = mydict({2: 1, 4: 5, 3: 7, 1: 2})
dit = iter(d)
print next(dit)  # 1
print next(dit)  # 2
print next(dit)  # 3
print next(dit)  # 4
print next(dit)  # StopIteration

请检查this answer以获得SortedDict的完整实施。

答案 1 :(得分:1)

你可以在dict键上返回一个迭代器。

class mydict(dict):
    def __iter__(self):
        return iter(sorted(self.keys()))

>>> d = mydict({ 3: 1, 8:2, 4:3,2:2})
>>> for x in d: print x
... 
2
3
4
8

答案 2 :(得分:0)

def sorted_keys(dict):
    return '\n'.join(sorted(dict.keys()))
dict={'c':'c', 'b':'b', 'a':'a'}
print sorted_keys(dict)