作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想为我的“玩具”Trie 实现编写一个迭代器。
添加已经像这样工作了:
class Trie:
def __init__(self):
self.root = dict()
pass
def add(self, string, value):
global nops
current_dict = self.root
for letter in string:
nops += 1
current_dict = current_dict.setdefault(letter, {})
current_dict = current_dict.setdefault('value', value)
pass
添加的输出如下所示:
trie = Trie()
trie.add("hello",1)
trie.add("world",2)
trie.add("worlds",12)
print trie.root
{'h': {'e': {'l': {'l': {'o': {'value': 1}}}}}, 'w': {'o': {'r': {'l': {'d': {'s': {'value': 12}, 'value': 2}}}}}}
我知道,我需要a __iter__
and next
method .
def __iter__(self):
self.root.__iter__()
pass
def next(self):
print self.root.next()
但是AttributeError:'dict'对象没有属性'next'
。我该怎么做?
[更新]在完美的世界中,我希望输出是一个字典,其中包含所有单词/条目及其相应的值。
最佳答案
你的__iter__
特殊方法应该返回一个迭代器;也就是说,您可以对其调用 next
的类的对象。玩具迭代器类类似于:
class MyIterator:
def __init__(self):
self.i = 10
def next(self):
self.i -= 1
if self.i == 0:
raise StopIteration
else:
return self.i
除非您有一个自然对象可以调用 iter
,否则通常更容易将 __iter__
设为生成器:
def __iter__(self):
for i in range(10)
yield i
这是一个用于 Trie
的基于堆栈的生成器迭代器:
def __iter__(self):
stack = [('', self.root)]
while stack:
prefix, d = stack.pop()
for k, v in d.items():
if k == 'value':
yield prefix, v
else:
stack.append((prefix + k, v))
您也可以尝试递归地编写它,尽管您需要使用 itertools.chain
或 yield from
(仅自 Python 3.3 起)。
关于python - 遍历嵌套字典,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13383187/
我是一名优秀的程序员,十分优秀!