[英]Union of 2 sets does not contain all items
為什么當我改變下面工會中兩套的順序時,我會得到不同的結果?
set1 = {1, 2, 3}
set2 = {True, False}
print(set1 | set2)
# {False, 1, 2, 3}
print(set2 | set1)
#{False, True, 2, 3}
1
和True
是等價的,被認為是重復的。 同樣, 0
和False
也是等價的:
>>> 1 == True
True
>>> 0 == False
True
遇到多個等效值時,set會保持第一個看到的值:
>>> {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()
使值不同的另一種方法是將它們存儲為字符串:
>>> set1 = {'1', '2', '3'}
>>> set2 = {'True', 'False'}
>>> set1 | set2
{'2', '3', 'False', 'True', '1'}
>>> set1 & set2
set()
希望這能揭開神秘面紗並展示前進的方向:-)
從評論中獲救:
這是打破交叉類型等價的標准技術(即0.0 == 0
, True == 1
和Decimal(8.5) == 8.5)
。 該技術在Python 2.7的正則表達式模塊中使用,以強制unicode正則表達式與其他等效的str正則表達式明顯緩存。 當typed參數為true時,該技術也在Python 3中用於functools.lru_cache()。
如果OP需要除默認等價關系之外的其他東西,則需要定義一些新的關系。 根據用例,可能是字符串不區分大小寫,unicode規范化,視覺外觀(看起來不同的東西被認為是不同的),標識(沒有兩個不同的對象被認為是相同的),值/類型對或其他一些定義等價關系的函數。 鑒於OP的具體示例,他/她似乎期望按類型或視覺區別進行區分。
在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 。 它們用於表示真值(盡管其他值也可以被認為是假或真)。 在數字上下文中(例如,當用作算術運算符的參數時),它們的行為分別與整數0和1相似。
比較運算符( ==
, !=
)定義為布爾值True
和False
以匹配1和0。
這就是為什么,在集合聯盟中,當它檢查True
是否已經在新集合中時,它會得到一個真正的答案:
>>> True in {1}
True
>>> 1 in {True}
True
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.