将Trie树节点作为参数传递 - 不工作

时间:2018-06-14 02:32:16

标签: python python-3.x tree trie

我正在尝试实现一个函数,该函数读取Trie树中包含的所有单词,将它们存储在带有键的列表中,并将它们写入.csv文件中。函数'insertTrie'工作正常;然而,当我将'root'作为参数传递给函数'getAllTrie'时,由于某种原因,当我在函数中打印它(作为测试)时,它会向节点添加一个字符串('q'),然后是“AttributeError” :'str'对象没有属性'char'“发生。当我在函数外打印'root'时,字符串不在那里。是什么造成的?我花了很长时间试图找到答案。

import csv

class Node():
   def __init__(self):
       self.sons = {}
       self.char = None
       self.value = None

def insertTrie(currentNode, word, size):
    if(size == len(word)):
        if(currentNode.value is None):
        currentNode.value = 1
        else:
            currentNode.value += 1
        return currentNode
    currentChar = word[size]
    if(currentChar not in currentNode.sons):
        currentNode.sons[currentChar] = Node()
        currentNode.sons[currentChar].char = currentChar
    currentNode.sons[currentChar] = insertTrie(currentNode.sons[ccurrentChar], word, size+1)
    return currentNode

def getAllTrie(currentNode, findWord):
    if(currentNode is not None):
        #print(currentNode) -> print root inside function, 'q' appears
        if(currentNode.char is not None):
            if(findWord is None):
                findWord = []
            findWord.append(currentNode.char)
        if(currentNode.value is not None):
            wordAndKey = [''.join(findWord), currentNode.value]
            writeCSVfile('exit.csv', wordAndKey)    # writes word and key in csv file
            findWord = None
        for son in currentNode.sons:
            getAllTrie(son, findWord)

root = Node()
testStr = 'querida queremos ate quero quero'
listStr = testStr.split( )
for word in listStr:
    root = insertTrie(root, word, 0)

#print(root) -> print root outside of function, 'q' doesn't appear
getAllTrie(root, None)

当我在函数'getAllTrie'之外打印'root'时(在代码中的注释中),它打印出来:

<__main__.Node object at 0x03323610>

但是当我在函数内部(也在评论中)打印它时,它会打印出来:

<__main__.Node object at 0x03323610>
q

我不知道为什么'q'存在。它是root的一个儿子中包含的角色,但它显示我在函数中打印根本身时,我不明白为什么。

1 个答案:

答案 0 :(得分:2)

您的sons属性是一个dict,将单字符字符串映射到节点。

所以,当你这样做时:

for son in currentNode.sons:

...每个son是一个单字符str对象,而不是Node个对象。这就是第一次递归调用打印q的原因,以及为什么它会针对没有'q'属性的sons字符串引发异常。

如果要迭代dict中的而不是,则需要这样说:

for son in currentNode.sons.values():

您的代码中还有其他多个错误,从无效缩进到ccurrentChar之类的错别字,并且它不完整(在任何地方都没有writeCSVFile函数),所以我可以& #39; t测试这是否实际修复了你的功能 - 但它确实修复了这个特定的bug。