web-dev-qa-db-ja.com

2セットのユニオンにはすべてのアイテムが含まれているわけではありません

下の組合で2つのセットの順序を変更すると、異なる結果が得られます。

set1 = {1, 2, 3}
set2 = {True, False}

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

print(set2 | set1)
#{False, True, 2, 3}
95
Blueplastic

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()
_

値を区別する別の方法は、それらを文字列として保存することです:

_>>> 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の場合、functools.lru_cache()のPython 3でも使用されます。

OPがデフォルトの同値関係以外のものを必要とする場合、いくつかの新しい関係を定義する必要があります。ユースケースに応じて、文字列の大文字と小文字を区別しない、ユニコードの正規化、外観(異なるように見えるものは異なると見なされる)、アイデンティティ(2つの異なるオブジェクトが等しいと見なされる)、値/タイプのペア、またはその他同値関係を定義する関数。 OPの特定の例を考えると、タイプごとの区別または視覚的な区別のいずれかを期待しているように思われます。

111

Pythonでは、False0は、True1と同様に、同等と見なされます。 True1は同じ値と見なされるため、同じセットに同時に存在できるのはそのうちの1つだけです。どちらがセットに追加されるかの順序に依存します。最初の行では、set1が最初のセットとして使用されるため、結果セットで1が取得されます。 2番目のセットでは、Trueが最初のセットにあるため、Trueが結果に含まれます。

21
mcslane

https://docs.python.org/3/library/stdtypes.html#boolean-values セクション4.12.10を見るとブール値:

ブール値は、2つの定数オブジェクトFalseとTrueです。これらは、真理値を表すために使用されます(ただし、他の値も偽または真と見なすことができます)。数値コンテキスト(算術演算子の引数として使用する場合など)では、それぞれintegers 0および1のように動作します。

7
chocksaway

比較演算子(==!=)は、ブール値TrueおよびFalseに対して1と0に一致するように定義されています。

そのため、集合結合では、Trueが既に新しい集合に含まれているかどうかを確認すると、真実の答えが得られます。

>>> True in {1}
True
>>> 1 in {True}
True
5
Uriel