我查看了这段代码:
>>> _end = '_end_'
>>>
>>> def make_trie(*words):
... root = dict()
... for word in words:
... current_dict = root
... for letter in word:
... current_dict = current_dict.setdefault(letter, {})
... current_dict = current_dict.setdefault(_end, _end)
... return root
...
>>> make_trie('foo', 'bar', 'baz', 'barz')
{'b': {'a': {'r': {'_end_': '_end_', 'z': {'_end_': '_end_'}},
'z': {'_end_': '_end_'}}},
'f': {'o': {'o': {'_end_': '_end_'}}}}
来自此链接:How to create a TRIE in Python,但我不太清楚为什么作者会创建临时变量current_dict,因为您始终只是编辑名为root的字典...
答案 0 :(得分:2)
我不太明白为什么作者创建临时变量current_dict,因为你总是只是编辑名为root的字典......
不,你不是。如果它总是编辑根词典,结果会非常不同。每次执行循环内的赋值时:
... current_dict = root
... for letter in word:
... current_dict = current_dict.setdefault(letter, {}) # this one
current_dict
被设置为一个级别的字典。此循环遍历trie,使用setdefault
根据需要构建缺少的部分。我们必须将setdefault
结果分配给current_dict
,以便继续使用trie而不是保持最高级别,我们必须使用单独的current_dict
变量而不是root
所以我们可以指定current_dict = root
,以便在完成一个单词后返回顶层。