当从trie中删除一个单词时,如果该单词的节点没有被用于另一个单词,我会尝试删除该单词的节点。
所以我不想在删除一个单词时仅仅标记一个节点。真正应该删除未使用的节点。
class Trie(object):
def __init__(self):
self.children = {}
self.end = "#"
def append_word(self, word: str):
node = self.children
for c in word:
node = node.setdefault(c, {})
node[self.end] = self.end
def delete(self, word):
node = self
parent = self
for char in word:
if char in node.children:
parent = node
node = node.children[char]
else:
return False
if not node.children:
del parent.children[char]
del node
return True
else:
node.end = "#"
return True
我在这里漏掉了什么?
我像这样从另一个类的trie实例调用函数:
self.trie.delete(user_input)
您的尝试的问题与以下两点有关:
>
您的append_word
方法显示节点没有子
属性。它们是字典。具有children
属性的唯一对象是trie
实例,而且只有一个这样的实例。结构的其余部分是以子
属性开始的嵌套字典
对于parent
,您只保留最后一个父级,而不是所有祖先。要做到这一点,您需要回溯可能的多个祖先,直到您遇到一个仍在使用另一个单词的祖先。因此,实际上您需要一个祖先列表,而不仅仅是一个父
引用。
以下是更正后的实现:
def delete(self, word):
node = self.children
stack = []
for char in word:
if char not in node: # Word is not in the Trie
return False
stack.append(node) # Collect as ancestor
node = node[char]
if self.end not in node: # End-of-word marker is missing, so word is not in Trie
return False
del node[self.end] # Remove end-of-word marker
for char in reversed(word): # Backtrack in reversed order
if len(node): # Still in use for another word?
break
node = stack.pop()
del node[char]
return True
在我的数据框架中,有一列名为“teams”。它包括城市和球队名称。我想把这个城市拉进另一个纵队。这是数据帧:数据帧示例 我可以使用正则表达式轻松提取列: 然而,在“名称”栏中,对于纽约尼克斯队,它只给了我“New”的值,我想得到“New York”: 结果 那么,我该怎么做呢?如果单元格有2个单词,我该如何从开头只提取一个单词?如果单元格有3个单词,我该如何使用正则表达式从中提取2个单词?
我想从文件。 示例: 我想给我们一种动态命令,因为我不必每次为每个用户手动输入。 我试过了 但这并没有达到预期的效果。
我有一个需要清理的字符向量。具体来说,我想删除“投票”之前的数字请注意,数字有一个逗号分隔千,因此更容易将其视为字符串。 我知道gsub("*.投票",",文本)将删除所有内容,但如何删除数字?另外,我如何将重复的空间折叠成一个空间? 谢谢你的帮助! 示例数据:
如果我有一个字符串“word3 word2 word3 word4 word5 word3 word7 word8 word9 word10” 我想找到所有的“word3”,使其在“word5”的3个单词之内,我将得到与“word3”第二次和第三次出现的匹配 我会使用什么正则表达式或逻辑?我有两种方法,但它们对我来说效率太低了。
之前: Lorem ipsum dolor sit amet,consectetur adipisicing elit,sed do eusmod tempor incidunt ut labore et dolore magna aliqua. 之后: elit,sed do eusmod tempor incidunt ut labore et dolore magna aliqua. 唯一的
问题内容: 我有一个像这样的词,它由两个简单的词组合而成,没有空格。 我想知道哪种Lucene Analyzer可以将这种单词标记为两个单独的单词? 问题答案: 有一个看作为在Solr的说明 该过滤器使用组成词的词典将复合词拆分或分解为单个词。每个输入令牌均不变地传递。如果还可以将其分解为子字,则每个子字也将在同一逻辑位置添加到流中。 在:“ Donaudampfschiff dummkopf”中