在python trie中存储字数

在python trie中存储字数,python,trie,Python,Trie,我拿了一张单词表,把它放进一个trie。我还想把字数存储在里面,以便进一步分析。最好的方法是什么?这是一门我认为会收集和存储频率的课程,但我不知道该怎么做。您可以看到我的尝试,insert中的最后一行是我尝试存储计数的地方 class TrieNode: def __init__(self,k): self.v = 0 self.k = k self.children = {} def all_words(self, prefix)

我拿了一张单词表,把它放进一个trie。我还想把字数存储在里面,以便进一步分析。最好的方法是什么?这是一门我认为会收集和存储频率的课程,但我不知道该怎么做。您可以看到我的尝试,insert中的最后一行是我尝试存储计数的地方

class TrieNode:
    def __init__(self,k):
        self.v = 0
        self.k = k
        self.children = {}
    def all_words(self, prefix):
        if self.end:
            yield prefix
        for letter, child in self.children.items():
            yield from child.all_words(prefix + letter)
class Trie:
    def __init__(self):
        self.root = TrieNode()
    def __init__(self):
        self.root = TrieNode()
    
    def insert(self, word):
        curr = self.root
        for letter in word:
            node = curr.children.get(letter)
            if not node:
                node = TrieNode()
                curr.children[letter] = node
            curr.v += 1

    def insert_many(self, words):
        for word in words:
            self.insert(word)
    def all_words_beginning_with_prefix(self, prefix):
        cur = self.root
        for c in prefix:
            cur = cur.children.get(c)
            if cur is None:
                return  # No words with given prefix
        yield from cur.all_words(prefix)


我想存储计数,以便在使用

print(list(trie.all_words_beginning_with_prefix('prefix')))

我会得到这样的结果:

[(word, count), (word, count)]

我会在trie节点中添加一个名为is_word的字段,其中is_word仅对单词中的最后一个字母为true。就像你有单词和,is_单词对于包含字母D的trie节点是真的。我将只更新那些有is_单词的节点的频率,而不是单词中的每个字母

所以当你从一个字母开始迭代时,检查它是否是一个单词,如果是,停止迭代,返回计数和单词。我假设在您的迭代中,您跟踪字母,并将它们添加到前缀中

您的trie是一个多路trie。

插入时,如果看到任何节点,则表示将在该路径中添加一个新词。因此,增加该节点的字数

类别三节点: 定义初始自我,字符: self.char=char self.word\u计数=0 self.children={} 定义所有单词本身、前缀、路径: 如果lenself.children==0: 产生前缀+路径 对于字母,self.children.items中的child: 从child.all_单词prefix,路径+字母生成 第三类: 定义初始自我: self.root=triode def insertself,word: curr=self.root 对于大写字母: 节点=curr.children.getletter 如果节点为无: 节点=三个字母 当前子项[字母]=节点 curr.word_count+=1每次在特定级别上看到节点时,将其递增。 curr=节点 def插入您自己的文字: 用文字表示: 自插入字 定义所有以前缀self开头的单词,前缀: cur=self.root 对于前缀中的c: cur=cur.children.getc 如果cur为None: 不返回带有给定前缀的单词 从cur.all_wordsRefix、path生成= def word_countself,前缀: cur=self.root 对于前缀中的c: cur=cur.children.getc 如果cur为None: 返回0 返回当前单词数 trie=trie trie.insert_many[你好,你好,随机,堆] 前缀=他 words=[w代表trie中的w。所有以前缀前缀开头的单词] printLazy方法:\n前缀:%s,单词:%s,计数:%d%Prefix,Words,lenwords printProactive方法:\n“%s”的字数:%d%前缀,trie.Word\u countprefix 输出:

惰性方法: 前缀:他,单词:[“你好”,“堆”,计数:2 主动方法: “他”的字数:2
你不应该更新word:loop中for字母末尾的curr=node吗?@tobias_k谢谢你的评论!我是个新手,今天是我第一次使用它,所以我不知道。但我想你是对的!是否存在具体的技术问题?请看。