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

bad*_*zil 80 python set

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

set(range(10)) - set(range(5))
Run Code Online (Sandbox Code Playgroud)

但这不是有效的:

set(range(10)) + set(range(5))
Run Code Online (Sandbox Code Playgroud)

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

Pla*_*ure 91

Python集没有+运算符的实现.

您可以使用|set union和&set intersection.

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

  • 谢谢.我不知道| 和&. (2认同)

Sin*_*ion 88

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

因为int已经将类似集合的运算符定义为|,&并且^set类型使用相同的接口是很自然的.

  • 我不确定它确实如此; "因为它是蓝色的"并不解释"为什么天蓝色?" (14认同)
  • 我认为这个答案更能解决问题中的"原因". (6认同)
  • 大概。+1为什么。但从某种意义上说,至少提问者似乎对只知道如何进行联合和交集感到满意。 (2认同)
  • @Platinum:我喜欢回答实际问的问题,所以当有其他人出现时,那个问题可以看到所有合理的答案; 即使提出原问题的人已经继续前进.在我们两个人之间,我们很好地回答. (2认同)
  • @TokenMacGuy:“因为 Python 根本没有定义运算符”也回答了原因。:-P (2认同)

Gio*_*gio 35

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

A + B = {(a, 1) | a in A} U {(b, 2) | b in B}
Run Code Online (Sandbox Code Playgroud)

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

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

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

  • **这是最佳答案。**在阅读此答复之前,我一直在抱怨为什么Guido重载了set Union的`|`运算符,却没弄明白Guido为什么还要避免为set Union重载`+`运算符的原因。毕竟,这样做会保留正交性,而+运算符会为列表添加重载。由于Python的特点是符合数学符号(例如,“ j”表示复数的复数分量),因此Guido的好奇选择最终是有意义的。 (3认同)

Mar*_*som 24

当然,他们可能已经习惯+了联盟,但是仍然需要一个交叉符号.|因为&交叉是对称的,因此是一个更好的选择.


Win*_*ert 10

因为|意味着联合和&意味着交集.显然没有理由为同一个函数添加多个运算符.

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

+简单不是与联盟有关,-而是要设置差异.


Pet*_*rin 5

因为设置差异是一个非常有用且众所周知的概念,但是没有(普遍使用的)\xe2\x80\x9eset 加法\xe2\x80\x9c 的概念。

\n

  • 联盟?您最后一次听到有人说“设置加法”而不是“并”,或者使用 + 代替 ∪ 是什么时候?有时“+”被定义为[成员加法](http://goo.gl/ZIm6y)。有些人将其用于[对称差异](http://www.cut-the-knot.org/do_you_know/add_set.shtml)。无论哪种方式,任何使用它的论文要么将其称为其他名称,要么首先定义它。 (2认同)
  • 如果有人不知道正确的术语,他们可能会将其称为“集合加法”。显然,知道“联盟”一词的人会使用“联盟”一词。 (2认同)