python - 查找数字子集的分组

标签 python set intersection

假设我有这些数字集

a = {1, 2, 3}
b = {2, 3, 4}
c = {1, 5}

我想找到集合的所有不同的数字分组。结果会是

{1}, {2, 3}, {4}, {5}

我天真的方法是这样的,但行不通:

data = [{1, 2, 3}, {2, 3, 4}, {1, 5}]
for i in range(1, 5):
    s = set.intersection(*[x for x in data if i in x])
    print(s)

返回

set([1])
set([2, 3])
set([2, 3])
set([2, 3, 4])

这可以很容易地删除重复数据,但不会给出预期的结果。

我怎样才能只得到集合子集中存在的数字分组?

最佳答案

您的代码有两个问题:

  • 您在 5 处停止,但 range 不包括停止点,因此您不检查 5。
  • 如果一个值只在一个集合中,您需要创建一个只包含该值的集合。至少您的预期结果看起来像是所需的行为。

因此,通过解决这些问题,代码将如下所示:

data = [{1, 2, 3}, {2, 3, 4}, {1, 5}]
for i in range(1, 6):
    useful_sets = [x for x in data if i in x]
    if len(useful_sets) <= 1:
        print(set([i]))
    else:
        s = set.intersection(*useful_sets)
        print(s)

# prints:
# {1}
# {2, 3}
# {2, 3}
# {4}
# {5}

要获得完整(而不是重复)的结果,您可以将它们存储为一组中的卡住集:

data = [{1, 2, 3}, {2, 3, 4}, {1, 5}]
res = set()
for i in range(1, 6):
    useful_sets = [x for x in data if i in x]
    if len(useful_sets) <= 1:
        res.add(frozenset([i]))
    else:
        s = set.intersection(*useful_sets)
        res.add(frozenset(s))

print(res)
# {frozenset({5}), frozenset({4}), frozenset({2, 3}), frozenset({1})}

哪个(顺序除外)应该正是您想要的。

关于python - 查找数字子集的分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44251983/

相关文章:

python集合列表在所有元素中找到对称差异

python - 如何使用 Django 检索多个查询参数值?

python - 使用元组键从 Dictionary[key1,key2] 中获取第一个键的列表

python - python 中的 type 和 type.__new__ 有什么区别?

java - 将大字符串拆分为 SET 项

r - 从包含数据帧的列表设置交集

c++ - 具有重复值的 Set_Intersection

R用findOverlaps()重叠多个GRanges

python - 在列表中查找与另一个列表中的元素近似相等的元素的索引

python - 通过 stem 库与 tor 的连接数 - Controller 创建 2 个连接,但关闭 Controller 只会删除一个连接