为什么Python集不能理解'+'?

时间:2011-10-07 20:02:24

标签: python set

我想知道为什么这是有效的:

set(range(10)) - set(range(5))

但这无效:

set(range(10)) + set(range(5))

是因为'+'可能意味着交叉和联合吗?

6 个答案:

答案 0 :(得分:86)

Python集合没有+运算符的实现。

您可以将|用于集合联合,将&用于集合交集。

设置实现-作为设置差异。您还可以使用^来表示对称集差异(即,它将返回一个新集,其中只有出现在一个集合中但不会出现在两个集合中的对象)。

答案 1 :(得分:85)

Python选择使用|而不是+,因为set union是一个与boolean disjunction密切相关的概念;位向量(在python中仅为int / long)在一系列布尔值中定义此操作,并将其称为“按位或”。事实上,这个操作与set union非常相似,二进制整数有时也被称为“Bit sets”,其中集合中的元素被认为是自然数。

由于int已将类似集合的运算符定义为|&^,因此较新的set类型使用相同的运算符是很自然的接口

答案 2 :(得分:31)

在集合论中,+符号通常表示两组的不相交联合。如果A和B是集合,则它们的不相交并集被定义为集合

A + B = {(a, 1) | a in A} U {(b, 2) | b in B}

即,为了构造不相交的联合,我们用不同的标记标记A的所有元素和B的所有元素(在示例中我使用数字1和2,但任何两个不同的“事物”将完成工作)和然后取两个结果集的并集。在上面的例子中,我使用'U'来设置联合,使其更像通常的数学符号;下面我使用Python表示法,即'|'为工会和'&'交集。

如果A和B不相交,则A + B与A |具有1对1的对应关系B.如果不是,那么A&中的所有共同元素x B在A + B中出现两次:一次为(x,1),一次为(x,2)。

因此,由于'+'符号作为集合操作具有相当完善的含义,因此我发现Python不会将此符号用于集合联合或交集。可能Python设计师在选择集合运算符时就考虑到了这一点。

答案 3 :(得分:24)

当然,他们可以使用+进行联合,但是仍然需要一个交叉符号。对于union而言,|&是对称的,因此可以做出更好的选择。

答案 4 :(得分:10)

因为|表示联合而&表示交集。显然没有理由为同一个函数添加多个运算符。

使用|&的原因可能会回到按位操作。如果将一个集合表示为数字中的位,那么这些是您用来进行并集和交叉的运算符。

+简单并不与联盟相关联,-就是设置差异。

答案 5 :(得分:3)

因为set difference是一个非常有用且众所周知的概念,但是没有(普遍使用的)“集合添加”的概念。