我想知道为什么这是有效的:
set(range(10)) - set(range(5))
但这是无效的:
set(range(10)) + set(range(5))
是否因为“ +”可能意味着交集和并集?
我想知道为什么这是有效的:
set(range(10)) - set(range(5))
但这是无效的:
set(range(10)) + set(range(5))
是否因为“ +”可能意味着交集和并集?
~
是二进制运算符,那么您可以具有|
+并号和~
求和项,这更加平衡。
Answers:
Python集没有用于+
运算符的实现。
您可以将其|
用于集合并集和&
交集。
集确实实现-
为集差异。您也可以使用^
对称集差异(即,它将返回一个新集,其中仅包含一个集中出现但两个集中都没有出现的对象)。
Python选择使用|
而不是使用,+
因为集合并集是一个与布尔析取关系密切相关的概念。位向量(在python中为int
/ long
)定义了一系列布尔值的操作,并将其称为“按位或”。实际上,此操作与集合联合非常相似,以至于有时二进制整数有时也称为“位集合”,其中集合中的元素被视为自然数。
因为int
已经定义了一套状运营商|
,&
并且^
,很自然的较新的set
类型使用相同的接口。
在集合论中,+符号通常表示两个集合的不交集并集。如果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设计人员在选择集合运算符时考虑了这一点。
|
使设置的工会重载了运营商,却没弄明白Guido为什么也避免+
了设置的联合重载运营商。毕竟,这样做将保留正交性,并且+
运算符会因列表添加而过载。由于Python的特点是符合数学符号(例如,j
表示复数的复杂部分),因此Guido的好奇选择最终是有意义的。
|
表示工会。你在问什么?