2套联盟不包含所有项目

当我改变下面工会中两套的顺序时,我得到了不同的结果?

set1 = {1, 2, 3} set2 = {True, False} print(set1 | set2) # {False, 1, 2, 3} print(set2 | set1) #{False, True, 2, 3} 

为什么union()不包含所有项目

1True是等价的,被认为是重复的。 同样, 0False也是相同的:

 >>> 1 == True True >>> 0 == False True 

使用哪个等价值

当遇到多个等价值时,集合保持第一个看到的:

 >>> {0, False} {0} >>> {False, 0} {False} 

如何使价值观独特

为了将它们视为不同的,只需将它们存储在(value, type)对中:

 >>> set1 = {(1, int), (2, int), (3, int)} >>> set2 = {(True, bool), (False, bool)} >>> set1 | set2 {(3, <class 'int'>), (1, <class 'int'>), (2, <class 'int'>), (True, <class 'bool'>), (False, <class 'bool'>)} >>> set1 & set2 set() 

另一种使值明确的方法是将它们存储为string:

 >>> set1 = {'1', '2', '3'} >>> set2 = {'True', 'False'} >>> set1 | set2 {'2', '3', 'False', 'True', '1'} >>> set1 & set2 set() 

希望这清除了这个谜,并展示了前进的道路:-)


从评论中救出:

这是打破交叉types等价的标准技术(即0.0 == 0True == 1Decimal(8.5) == 8.5) 。 该技术被用在Python 2.7的正则expression式模块中,以强制unicode正则expression式从其他等效的str正则expression式caching。 当types化的参数为true时,该技术也在Python 3中用于functools.lru_cache()。

如果OP需要默认的等价关系以外的东西,那么需要定义一些新的关系。 根据用例,这可能是string不区分大小写,unicode规范化,可视化外观(看起来不同的东西被认为是不同的),同一性(没有两个不同的对象被认为是相等的),值/types对或者其他定义等价关系的函数。 鉴于OP的具体例子,他/她似乎期望按types区别或视觉区分。

在Python中, False0被认为是等价的,如同True1 。 因为“ True和“ 1被认为是相同的值,所以只有其中一个可以同时出现在一个集合中。 哪一个取决于它们被添加到集合中的顺序。在第一行中, set1被用作第一集合,所以我们在结果集合中得到1 。 在第二组中, True在第一组中,所以True包含在结果中。

如果您查看https://docs.python.org/3/library/stdtypes.html#boolean-values部分4.12.10。; 布尔值:

布尔值是两个常量对象False和True 。 它们被用来表示真值(尽pipe其他值也可以被认为是虚假的)。 在数字上下文中(例如,当用作算术运算符的参数时),它们的行为分别与整数0和1相同。

比较运算符( ==!= )被定义为布尔TrueFalse来匹配1和0。

这就是为什么在组合联合中,当它检查True是否已经在新组合中时,它会得到一个真实的答案:

 >>> True in {1} True >>> 1 in {True} True