Вы можете использовать генератор и 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]
Ресурсы: