在 Python 中的一组集合中查找具有特定元素的集合

Find set with specific element in set of sets in Python

我在 Python 中有以下一组集合(任何元素都不能出现超过一个):

set_of_sets = {frozenset({"01", "02", "03"}),
               frozenset({"04", "05", "06"}),
               frozenset({"07", "08"}),
               frozenset({"09", "10"}),
               frozenset({"11"}),
               frozenset({"12"}),
               frozenset({"13"}),
               frozenset({"14"}),
               frozenset({"15"})}

现在,我想弄清楚是否有任何请求的元素在集合集合中,如果是,具体集合是什么(获取这个集合的所有元素)。到目前为止我已经到了这里:

if any("001" in subset for subset in set_of_sets):
   print("Present:")
else:
   print("Not Present")

但这并没有给出搜索结果本身。我可以选择这个选项:

for subset in set_of_sets:
    if "01" in subset:
        print(subset)

但这并没有处理未找到相关元素的可能性,并且考虑到元素唯一出现的性质,对子集的这种完整迭代有点浪费(以防我们找到子集)。

你可以这样写:

next(s for s in set_of_sets if "08" in s)

如果找不到项目,这将引发 StopIteration

正如 Mark 在评论中指出的那样,如果您想要 None 这样的结果,可以使用 next 的可选默认参数来避免异常:

next((s for s in set_of_sets if "08" in s), None)

您可以对 return 找到的项目列表使用列表理解,因为您只会找到一个,所以您可以简单地打印找到的 [0]。空列表将命中 else 块并打印 'Not Present'


found = [subset for subset in set_of_sets if "13" in subset]

if found:
    print("Present:")
    print(found[0])
else:
   print("Not Present")

我会使用以数字为键、以集合为值的字典,但我们也可以改进您的字典:

this full iteration over the subsets is somewhat wasteful

所以使用break:

for subset in set_of_sets:
    if "01" in subset:
        print(subset)
        break

this doesn't handle the possibility of not founding the element in question

所以使用else:

for subset in set_of_sets:
    if "01" in subset:
        print(subset)
        break
else:
    print("Not Present")