如何查找是否在多个元组中都找到了多个集合(但绝不是同一个元组)?
How to find if multiple sets are all found in multiple tuples (but never the same tuple)?
我有一个列表列表,每个列表由整数 0
到 11
的四值组合的三个元组组成,例如:
[(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
我有一个列表列表,每个列表由整数 0
到 11
的四值组合的三个元组组成,例如:
[(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