我正在尝试实现一个函数,该函数读取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的一个儿子中包含的角色,但它显示我在函数中打印根本身时,我不明白为什么。
答案 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。