在集合之间计算产品,仅保留没有重复项目的产品

时间:2017-08-19 09:35:11

标签: python set cartesian-product

我有一个类似于[{0, 1}, {1, 2}, {2, 3}, {3, 4}, {4, 5}]的集合列表,我需要计算这些集合之间的产品,但只保留不会重复数字的解决方案。我找到了一个使用itertools.product的解决方案,但是这仍然计算所有产品,我想知道是否有一个内置方法立即产生我想要的东西(或者如果你有一个建议)操纵数据结构以加快计算时间是很受欢迎的。)

我的解决方案:

from itertools import product

def pick(sets):
    for p in product(*sets):
        if len(set(p)) == len(p):
            yield p

这导致了所需的输出:

>>> x = [{i, i+1} for i in range(5)]
>>> for p in pick(x):
...     print(p)
...
(0, 1, 2, 3, 4)
(0, 1, 2, 3, 5)
(0, 1, 2, 4, 5)
(0, 1, 3, 4, 5)
(0, 2, 3, 4, 5)
(1, 2, 3, 4, 5)

1 个答案:

答案 0 :(得分:4)

def pick(sets, excluding=frozenset()):
    if not sets:
        yield ()
        return
    for x in sets[0] - excluding:
        for rest in pick(sets[1:], excluding | {x}):
            yield (x,) + rest