Python Trie实现为什么要创建临时变量

时间:2015-05-17 00:22:00

标签: python algorithm data-structures implementation trie

我查看了这段代码:

>>> _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的字典...

1 个答案:

答案 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,以便在完成一个单词后返回顶层。