Python集合操作-补集并集

7

我现在正在学习离散数学,试图复制德摩根定律:

补集(B并C) = 补集(B)交补集(C)。

我尝试搜索Python对集合进行补集操作的能力,但似乎没有找到什么有用的信息。

于是我在IDLE中尝试了下面的代码。请问这个代码正确吗?

U = {'pink', 'purple', 'red', 'blue', 'gray', 'orange', 'green', 'yellow', 'indigo', 'violet'}
A = {'purple', 'red', 'orange', 'yellow', 'violet'}
B = {'blue', 'gray', 'orange', 'green'}
C = {'pink', 'red','blue','violet'}
Comp_B = U - B
Comp_C = U - C
Comp_Union_BC = Comp_B.intersection(Comp_C)
print(Comp_Union_BC)

集合的补集是“其他所有东西”。这里的“其他所有东西”是什么? - Martijn Pieters
没有一个普遍集合的定义,你实际上无法给出一个集合的补集的定义。这回答了我的问题。如果Python内置了一个以定义的集合作为参数的函数,那就太好了,这样你就可以使用它了。也许我需要为Python标准库制作这个函数。 - TimmyTooTough
但是如上所示,complement(a)实际上只是U.difference(a)的别名。你可以直接使用complement = U.difference - Martijn Pieters
2个回答

12

一个集合的补集是不在该集合内,但是属于“全集”的所有元素。如果没有“全集”的定义,就无法给出标准库对于“集合的补集”的定义。

此外,Python的“set”类型处理的是离散对象的集合,而不是像“所有自然数”这样可能无限大的数学构造。因此,Python不支持单个普遍集合的一般性、模糊和无限的概念。

对于特定领域,如果您可以用离散术语定义普遍集合,那么只需定义自己的“complement()”可调用函数即可。例如,假设有一个全局定义的普遍集合“U”,则可以将集合“a”的补集定义为“U”与该集合之间的差异:

U = {'pink', 'purple', 'red', 'blue', 'gray', 'orange', 'green', 'yellow', 'indigo', 'violet'}

def complement(a):
    # difference between a global universal set U and the given set a
    return U - a

或者更简单地说:

complement = U.difference

然后只需将一个集合传递给 complement()来测试假设:

>>> # set | set == set union, set & set == set intersection
...
>>> complement(B | C) == complement(B) & complement(C)
True

是的,你理解的没错,U - B会生成B的补集。


2
他定义了全集...它是 U = {'粉色','紫色','红色','蓝色','灰色','橙色','绿色','黄色','靛蓝色','紫罗兰色'} - Haris Nadeem
2
@HarisNadeem:是的,我的回答试图解释为什么Python没有为集合定义“补集”操作。 - Martijn Pieters
我的错误,我误读了你的答案。你是正确的。+1 赞同 - Haris Nadeem

0
如果你扩展了`set`类,也就是创建了一个`set`的子类,那会怎样呢?这个子类将会有一个名为`complement`的属性,它将有助于证明德摩根定律。请确保重写`union`方法。
class Set(set):
    def __init__(self, s=(), U=None):
        super().__init__(s)
        self.U = U

    def union(self, A):
        return Set(super().union(A), self.U)

    @property
    def complement(self):
        if U is None:
            raise Exception('Universal set not defined')
        return Set(self.U - self, self.U)

U = {'pink', 'purple', 'red', 'blue', 'gray', 'orange', 'green', 'yellow', 'indigo', 'violet'}
A = Set({'purple', 'red', 'orange', 'yellow', 'violet'}, U)
B = Set({'blue', 'gray', 'orange', 'green'}, U)
C = Set({'pink', 'red','blue','violet'}, U)

现在,你只需运行以下代码:

>>> B.union(C).complement == B.complement.intersection(C.complement)
True

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接