查找在python中出现在k个以上集合中的元素

时间:2018-12-22 05:41:46

标签: python set intersection

我正在实现一个基本的拼写校正系统,并且为我所在域的语言建立了一个反向索引,其中每个字符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')

由于ae分别出现在3套以上。

感谢您的想法。

2 个答案:

答案 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']