如何查找是否在多个元组中都找到了多个集合(但绝不是同一个元组)?

How to find if multiple sets are all found in multiple tuples (but never the same tuple)?

我有一个列表列表,每个列表由整数 011 的四值组合的三个元组组成,例如:

[(0, 1, 4, 7), (2, 3, 6, 9), (5, 8, 10, 11)]

我想知道这个列表(和其他列表)是否在至少一个元组中包含某些整数,并且在至少一个其他元组中包含其他整数。

如果我想检查是否至少 一个 元组包含某些整数,这很简单。例如,你可以有这样的东西:

def func_1(lst):
    for tup in lst:
        if {0,1}.issubset(tup):
            return True
    return False

returns True [(0, 1, 4, 7), (2, 3, 6, 9), (5, 8, 10, 11)]
...但是 False 对于 [(0, 4, 7, 9), (1, 2, 3, 6), (5, 8, 10, 11)]

但是如果我想查找一个元组是否包含 {0,1} 而另一个 separate 元组是否包含 {2, 3} 怎么办?这样的事情是行不通的:

def func_2(lst):
    for tup in lst:
        if {0,1}.issubset(tup) or {2,3}.issubset(tup):
            return True
    return False

上面两个列表 return True,而第一个列表只有 True

您必须遍历元组,并针对两个集合测试每个元组。然后,如果其中一个集合匹配,则将该集合从考虑中删除,只有 return 如果所有集合在其余部分都匹配,则为真:

def func_2(lst):
    sets_to_test = {frozenset({0,1}), frozenset({2,3})}
    for tup in lst:
        matched = next((s.issubset(tup) for s in sets_to_test), None)
        if matched:
            s.remove(matched)
            if not sets_to_test:
                # all sets have matches to separate tuples
                return True
    return False

这种方法也将扩展到更多集合。

请注意,如果存在作为任一集合的子集的元组,则此 可能 无法匹配。如果这是您需要考虑的可能性,我会使用递归来处理此选项:

def func_2(lst, sets_to_test=None):
    if sets_to_test is None:
        sets_to_test = {frozenset({0,1}), frozenset({2,3})}
    if not sets_to_test:
        # all sets have matched
        return True
    if not lst:
        # no tuples remain
        return False
    for i, tup in enumerate(lst):
        for set_to_test in sets_to_test:
            if set_to_test.issubset(tup):
                if func_2(lst[i + 1:], sets_to_test - {set_to_test}):
                    return True
    return False

因此,只要其中一个集合匹配,就会使用递归来测试剩余的集合和元组列表;如果该递归调用没有 return True,将测试更多集合。

使用2个函数。第一个检查你的第一场比赛。然后调用剩余元素上的第二个来检查你的第二个匹配项。如果有 none,请继续您之前的搜索。

def sub_search(lst):
    for tup in lst:
        if {2,3}.issubset(tup):
            return True
    return False

def search(lst):
    for i,tup in enumerate(lst):
        if {0,1}.issubset(tup):
            if sub_search(lst[0:i]+lst[i+1:]):
                return True
    return False