我想知道为什么这是有效的:
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.
集合实现-
为设置差异.您还可以使用^
对称集差异(即,它将返回一个新集合,其中只有出现在一个集合中但不出现在两个集合中的对象).
Sin*_*ion 88
Python选择使用|
而不是+
因为set union是一个与boolean disjunction密切相关的概念; 位向量(在python中只是int
/ long
)在一系列布尔值中定义此操作,并将其称为"按位或".事实上,这个操作与set union非常相似,二进制整数有时也被称为"Bit sets",其中集合中的元素被认为是自然数.
因为int
已经将类似集合的运算符定义为|
,&
并且^
新set
类型使用相同的接口是很自然的.
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设计师在选择集合运算符时就考虑到了这一点.
Win*_*ert 10
因为|
意味着联合和&
意味着交集.显然没有理由为同一个函数添加多个运算符.
使用的原因|
和&
可能要追溯到位操作.如果将一个集合表示为数字中的位,那么这些是您用来进行并集和交叉的运算符.
+
简单不是与联盟有关,-
而是要设置差异.
因为设置差异是一个非常有用且众所周知的概念,但是没有(普遍使用的)\xe2\x80\x9eset 加法\xe2\x80\x9c 的概念。
\n