我想计算不同值的数量,我的幼稚解决方案是保留一个set
并对其进行更新,直到完成迭代为止,然后我得到此集合的len
作为答案。
但是,当数据集很大时,这是不可能的。而且每次迭代我不仅要计算一种类型的不同值,这意味着我必须保留更多的集合。
我想知道有更好的方法吗?也许其他一些内置数据结构可以帮助我?谢谢!
答案 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