将 Trie 树节点作为参数传递 - 不起作用
Passing Trie tree node as parameter - not working
我正在尝试实现一个函数,该函数读取 Trie 树中包含的所有单词,将它们与它们的键一起存储在列表中,并将它们写入 .csv 文件。函数 'insertTrie' 工作正常;但是,当我将 'root' 作为参数传递给函数 'getAllTrie' 时,出于某种原因,当我在函数中打印它时,它会向节点添加一个字符串 ('q')(作为测试) 然后 "AttributeError: 'str' object has no attribute '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 的一个儿子中包含的字符,但是当我在函数中打印 root 本身时它会显示,我不知道为什么。
您的 sons
属性是一个字典,将单字符字符串映射到节点。
所以,当您这样做时:
for son in currentNode.sons:
…每个son
是一个单字符str
对象,而不是Node
对象。这就是为什么第一个递归调用打印出 q
,以及为什么它引发关于 'q'
字符串没有 sons
属性的异常。
如果你想遍历字典中的 values,而不是 keys,你需要这样说:
for son in currentNode.sons.values():
您的代码中还有多个其他错误,从无效缩进到像 ccurrentChar
这样的拼写错误,而且它不完整(任何地方都没有 writeCSVFile
函数),所以我无法测试这是否真的修复了您的功能——但它确实修复了这个特定的错误。
我正在尝试实现一个函数,该函数读取 Trie 树中包含的所有单词,将它们与它们的键一起存储在列表中,并将它们写入 .csv 文件。函数 'insertTrie' 工作正常;但是,当我将 'root' 作为参数传递给函数 'getAllTrie' 时,出于某种原因,当我在函数中打印它时,它会向节点添加一个字符串 ('q')(作为测试) 然后 "AttributeError: 'str' object has no attribute '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 的一个儿子中包含的字符,但是当我在函数中打印 root 本身时它会显示,我不知道为什么。
您的 sons
属性是一个字典,将单字符字符串映射到节点。
所以,当您这样做时:
for son in currentNode.sons:
…每个son
是一个单字符str
对象,而不是Node
对象。这就是为什么第一个递归调用打印出 q
,以及为什么它引发关于 'q'
字符串没有 sons
属性的异常。
如果你想遍历字典中的 values,而不是 keys,你需要这样说:
for son in currentNode.sons.values():
您的代码中还有多个其他错误,从无效缩进到像 ccurrentChar
这样的拼写错误,而且它不完整(任何地方都没有 writeCSVFile
函数),所以我无法测试这是否真的修复了您的功能——但它确实修复了这个特定的错误。