如何找到多个集合是否都在多个元组中找到(但从来没有相同的元组)?

时间:2018-05-19 10:22:30

标签: python python-3.x set tuples

我有一个列表列表,每个列表包含三个整数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

返回True的{​​{1}} ...... [(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}怎么办?这样的东西不起作用:

{2, 3}

对于上述两个列表,如果第一个列表只有def func_2(lst): for tup in lst: if {0,1}.issubset(tup) or {2,3}.issubset(tup): return True return False ,则会返回True

2 个答案:

答案 0 :(得分:1)

您必须迭代元组,并针对两组测试每个元组。然后,如果其中一个匹配,则从考虑中删除该集合,如果所有集合在余数中都匹配,则仅返回true:

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

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

答案 1 :(得分:0)

使用2个功能。第一次检查你的第一场比赛。然后在剩下的元素上调用第二个来检查你的第二场比赛。如果没有,请继续之前的搜索。

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