我正在实现一个基本的拼写校正系统,并且为我所在域的语言建立了一个反向索引,其中每个字符bigram都映射到包含该bigram的单词列表中。
现在,我想查找与给定单词w
共享超过3个字符双字母组的所有单词。因此,主要问题是:给定一组列表,一个人如何才能高效地找到其中三个或三个以上元素?
例如,给定集合:
('a', 'b', 'c', 'd') , ('a', 'e', 'f', 'g'), ('e', 'f', 'g', 'h'), ('b', 'c', 'z', 'y'), ('e', 'k', 'a', 'j')
我喜欢获取输出:
('a', 'e')
由于a
和e
分别出现在3套以上。
感谢您的想法。
答案 0 :(得分:1)
@Ralf之外的其他内容。您可以使用字典来构建直方图
someCollection = [('a', 'b', 'c', 'd') , ('a', 'e', 'f', 'g'), ('e', 'f', 'g', 'h'), ('b', 'c', 'z', 'y'), ('e', 'k', 'a', 'j')]
hist = {}
for collection in someCollection:
for member in collection:
hist[member] = hist.get(member, 0) + 1
现在的历史记录是:
{'a': 3,
'b': 2,
'c': 2,
'd': 1,
'e': 3,
'f': 2,
'g': 2,
'h': 1,
'z': 1,
'y': 1,
'k': 1,
'j': 1}
可以用sorted(hist.items(), key = lambda x[1]) # sort along values
答案 1 :(得分:0)
您可以尝试使用collections.Counter
:
from collections import Counter
data = [
('a', 'b', 'c', 'd'),
('a', 'e', 'f', 'g'),
('e', 'f', 'g', 'h'),
('b', 'c', 'z', 'y'),
('e', 'k', 'a', 'j'),
]
c = Counter()
for e in data:
c.update(e)
# print(c)
# for k, v in c.items():
# if v >= 3:
# print(k, v)
使用以下命令(或类似方法)可获得输出:
>>> [k for k, v in c.items() if v >= 3]
['a', 'e']