我想知道为什么这是有效的:
set(range(10)) - set(range(5))
但这无效:
set(range(10)) + set(range(5))
是因为'+'可能意味着交叉和联合吗?
答案 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是一个非常有用且众所周知的概念,但是没有(普遍使用的)“集合添加”的概念。