簡體   English   中英

2套聯盟不包含所有物品

[英]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}

為什么union()不包含所有項目

1True是等價的,被認為是重復的。 同樣, 0False也是等價的:

>>> 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 == 0True == 1Decimal(8.5) == 8.5) 該技術在Python 2.7的正則表達式模塊中使用,以強制unicode正則表達式與其他等效的str正則表達式明顯緩存。 當typed參數為true時,該技術也在Python 3中用於functools.lru_cache()。

如果OP需要除默認等價關系之外的其他東西,則需要定義一些新的關系。 根據用例,可能是字符串不區分大小寫,unicode規范化,視覺外觀(看起來不同的東西被認為是不同的),標識(沒有兩個不同的對象被認為是相同的),值/類型對或其他一些定義等價關系的函數。 鑒於OP的具體示例,他/她似乎期望按類型或視覺區別進行區分。

在Python中, False0被認為是等價的, True1 因為True1被認為是相同的值,所以它們中只有一個可以同時出現在一個集合中。 哪一個取決於它們被添加到集合中的順序。在第一行中, set1用作第一個集合,因此我們在結果集合中得到1 在第二組中, True在第一組中,因此True包含在結果中。

如果你看一下https://docs.python.org/3/library/stdtypes.html#boolean-values第4.12.10節。 布爾值:

布爾值是兩個常量對象False和True 它們用於表示真值(盡管其他值也可以被認為是假或真)。 在數字上下文中(例如,當用作算術運算符的參數時),它們的行為分別與整數0和1相似。

比較運算符( ==!= )定義為布爾值TrueFalse以匹配1和0。

這就是為什么,在集合聯盟中,當它檢查True是否已經在新集合中時,它會得到一個真正的答案:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM