如何在不保留大量值的情况下获取Python中不同值的计数

时间:2019-06-10 04:24:17

标签: python data-structures

我想计算不同值的数量,我的幼稚解决方案是保留一个set并对其进行更新,直到完成迭代为止,然后我得到此集合的len作为答案。

但是,当数据集很大时,这是不可能的。而且每次迭代我不仅要计算一种类型的不同值,这意味着我必须保留更多的集合。

我想知道有更好的方法吗?也许其他一些内置数据结构可以帮助我?谢谢!

1 个答案:

答案 0 :(得分:2)

使用Trie。有几个python库,例如Marisa-trie。或者查看此堆栈溢出答案以创建自己的How to create a TRIE in Python。每次将新单词添加到Trie时,增加一个计数器。

这是一个简单的嵌套字典实现。它跟踪单词的总数和每个单词的数量。

END = 'end'

class Trie:

    def __init__(self, words_iterable):
        self.root = {}
        self.size = 0

        for word in iter(words_iterable):
            self.insert(word)

    def insert(self, word):
        current_dict = self.root
        for letter in word:
            current_dict = current_dict.setdefault(letter, {})

        if END not in current_dict:
            current_dict[END] = 0
            self.size += 1
        current_dict[END] += 1

    def count(self, word):
        current_dict = self.root
        for letter in word:
            current_dict = current_dict.setdefault(letter, {})
        return current_dict.get(END, 0)

    def __len__(self):
        return self.size

    def __str__(self):
        return str(self.root)

示例:

trie = Trie('one two one three four'.split())
trie.insert('four')

print(trie)

>>> {'o': {'n': {'e': {'end': 2}}}, 't': {'w': {'o': {'end': 1}}, 'h': {'r':
    {'e': {'e': {'end': 1}}}}}, 'f': {'o': {'u': {'r': {'end': 2}}}}}

len(trie)
>>> 4

trie.count('four')
>>> 2