【问题标题】:Passing Trie tree node as parameter - not working将 Trie 树节点作为参数传递 - 不起作用
【发布时间】:2018-11-23 17:14:22
【问题描述】:

我正在尝试实现一个函数,该函数读取包含在 Trie 树中的所有单词,将它们与它们的键一起存储在一个列表中,并将它们写入一个 .csv 文件中。函数“insertTrie”工作正常;但是,当我将“root”作为参数传递给函数“getAllTrie”时,由于某种原因,当我在函数中打印它(作为测试)然后“AttributeError”时,它会向节点添加一个字符串(“q”) : '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”。这是根的一个儿子中包含的字符,但是当我在函数中打印根本身时它会显示出来,我不知道为什么。

【问题讨论】:

    标签: python python-3.x tree trie


    【解决方案1】:

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

    所以,当你这样做时:

    for son in currentNode.sons:
    

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

    如果你想遍历字典中的values,而不是keys,你需要这样说:

    for son in currentNode.sons.values():
    

    您的代码中有多个其他错误,从无效缩进到诸如 ccurrentChar 之类的拼写错误,而且它不完整(任何地方都没有 writeCSVFile 函数),所以我无法测试这是否真的修复了您的函数 - 但它确实修复了这个特定的错误。

    【讨论】:

    • 抱歉有错别字,不包括 writeCSVfile。确实解决了这个问题,非常感谢。我还纠正了我的代码中的其他问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-06
    • 2016-09-22
    • 2011-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多