这是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
由于没有提供标准答案,我只想知道这是否是最佳答案。 谢谢。
答案 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)