gpt4 book ai didi

python - 遍历嵌套字典

转载 作者:行者123 更新时间:2023-12-01 05:53:37 43 4
gpt4 key购买 nike

我想为我的“玩具”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.chainyield from (仅自 Python 3.3 起)。

关于python - 遍历嵌套字典,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13383187/

43 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com