为什么Python集无法理解“ +”?


90

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

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

但这是无效的:

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

是否因为“ +”可能意味着交集和并集?


3
|表示工会。你在问什么?
S.Lott

13
这是因为Guido为交集和并集选择了不同的运算符。
David Heffernan

3
@David Heffernan,Guido通常不会无缘无故或至少有一些指导原则来做事情-这就是让Python如此出色的原因。
Mark Ransom

1
@Mark哦,我很确定他是有充分理由的。
David Heffernan

1
如果仅~是二进制运算符,那么您可以具有|+并号和~求和项,这更加平衡。
马特·乔纳

Answers:


109

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

您可以将其|用于集合并集和&交集。

集确实实现-为集差异。您也可以使用^对称集差异(即,它将返回一个新集,其中仅包含一个集中出现但两个集中都没有出现的对象)。


2
谢谢。我不知道| 和&。
badzil 2011年

99

Python选择使用|而不是使用,+因为集合并集是一个与布尔析取关系密切相关的概念。位向量(在python中为int/ long)定义了一系列布尔值的操作,并将其称为“按位或”。实际上,此操作与集合联合非常相似,以至于有时二进制整数有时也称为“位集合”,其中集合中的元素被视为自然数。

因为int已经定义了一套状运营商|&并且^,很自然的较新的set类型使用相同的接口。


7
我认为这个答案可以更好地解决问题中的“为什么”。
格雷格·亨德肖特2011年

1
大概。为+1。但是从某种意义上说,至少问问者似乎对只知道如何进行合并和相交感到满意。
白金Azure

2
@Platinum:我喜欢回答实际提出的问题,因此当有人提出该问题时,可以看到所有合理的答案;即使提出原始问题的人继续前进。在我们两个之间,我们回答得很好。
SingleNegationElimination 2011年

1
@TokenMacGuy:“因为Python根本没有定义运算符”,也回答了为什么。:-P
白金Azure

15
我不确定是否可以。“因为是蓝色”没有解释“为什么天空是蓝色?”
SingleNegationElimination

36

在集合论中,+符号通常表示两个集合的不交集并集。如果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和B中的所有公共元素x在A + B中出现两次:一次为(x,1),一次为(x,2)。

因此,由于“ +”符号作为集合操作具有非常明确的含义,因此我发现Python不会将此符号用于集合并集或交集非常一致。可能是Python设计人员在选择集合运算符时考虑了这一点。


5
这是最佳答案。在阅读此答复之前,我一直在抱怨为什么Guido|使设置的工会重载了运营商,却没弄明白Guido为什么也避免+了设置的联合重载运营商。毕竟,这样做将保留正交性,并且+运算符会因列表添加而过载。由于Python的特点是符合数学符号(例如,j表示复数的复杂部分),因此Guido的好奇选择最终是有意义的。
塞西尔·库里

23

当然,他们本来可以+做一个联合,但那时仍然需要一个符号来表示交集。|因为联合与&交叉是对称的,因此是更好的选择。


10

因为|意味着结合而&意味着交叉。显然没有理由为同一功能添加多个运算符。

使用的原因|&可能要追溯到位操作。如果将集合表示为数字中的位,则这些是用于进行合并和相交的运算符。

+简单不像工会那样重要,-而是要设定差异。


3

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


1
联盟?您是什么时候最后一次听到有人说“设置加法”而不是“联合”,或者用+代替∪?有时+被定义为成员级加法。有些人将其用于对称差异。无论哪种方式,任何使用它的论文都将其称为其他名称或首先对其进行定义。
Petr Viktorin

1
如果他们不知道正确的术语,可能有人将其称为“集合加法”。显然,知道“工会”一词的人会使用“工会”一词。
蓬松的
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.