2套联盟不包含所有项目
当我改变下面工会中两套的顺序时,我得到了不同的结果?
set1 = {1, 2, 3} set2 = {True, False} print(set1 | set2) # {False, 1, 2, 3} print(set2 | set1) #{False, True, 2, 3}
为什么union()不包含所有项目
1
和True
是等价的,被认为是重复的。 同样, 0
和False
也是相同的:
>>> 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 == 0
, True == 1
和Decimal(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中, False
和0
被认为是等价的,如同True
和1
。 因为“ True
和“ 1
被认为是相同的值,所以只有其中一个可以同时出现在一个集合中。 哪一个取决于它们被添加到集合中的顺序。在第一行中, set1
被用作第一集合,所以我们在结果集合中得到1
。 在第二组中, True
在第一组中,所以True
包含在结果中。
如果您查看https://docs.python.org/3/library/stdtypes.html#boolean-values部分4.12.10。; 布尔值:
布尔值是两个常量对象False和True 。 它们被用来表示真值(尽pipe其他值也可以被认为是虚假的)。 在数字上下文中(例如,当用作算术运算符的参数时),它们的行为分别与整数0和1相同。
比较运算符( ==
, !=
)被定义为布尔True
和False
来匹配1和0。
这就是为什么在组合联合中,当它检查True
是否已经在新组合中时,它会得到一个真实的答案:
>>> True in {1} True >>> 1 in {True} True