如何找到3个大集合的交集的100个元素的列表?

时间:2019-05-26 11:57:34

标签: python algorithm set

有什么方法可以避免计算所有3个集合的交集,然后对前100个数字进行切片?

到目前为止,我的代码是:

def intersection_alg():
    get_set_from_variable = [A,B,C]
    cfs_set = set()
    for logical_name in get_set_from_variable:
            tmp_set = set(get_list_from_db(logical_name))
        cfs_set = cfs_set.intersection(tmp_set) if cfs_set else cfs_set
    return list(cfs_set)[:100]

1 个答案:

答案 0 :(得分:1)

您可以使用生成器和itertools.islice,请参见下面的示例。根据您对集合内容的了解,也许可以通过更改for循环中的迭代顺序来提高性能。

运行之间的确切结果可能会有所不同,因为集合会以任意顺序进行迭代。

游乐场:answer

import itertools


def lazy_intersection(*sets):
    for x in min(sets, key=lambda s: len(s)):
        if all(x in s for s in sets):
            yield x


a = {2*k for k in range(1000)}
b = {3*k for k in range(1000)}
c = {5*k for k in range(1000)}

generator = lazy_intersection(a, b, c)

first_10 = list(itertools.islice(generator, 10))
print(first_10)

输出(请注意,不能保证升序):

[0, 30, 60, 90, 120, 150, 180, 210, 240, 270]

资源: