Как найти список из 100 элементов пересечения 3 больших множеств? - PullRequest
0 голосов
/ 26 мая 2019

Есть ли способ избежать вычисления пересечения всех трех множеств и затем разрезать первые 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 Ответ

1 голос
/ 26 мая 2019

Вы можете использовать генератор и itertools.islice, см. Пример ниже. В зависимости от того, что вы знаете о содержании ваших наборов, вы можете улучшить производительность, изменив порядок, в котором вы выполняете итерации в цикле for.

Точный результат может отличаться между прогонами, поскольку наборы повторяются в произвольном порядке.

Детская площадка: https://ideone.com/hMBZIw

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]

Ресурсы:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...