下の組合で2つのセットの順序を変更すると、異なる結果が得られます。
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
_
同等の値が複数見つかった場合、セットは最初の値を保持します。
_>>> {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の特定の例を考えると、タイプごとの区別または視覚的な区別のいずれかを期待しているように思われます。
Pythonでは、False
と0
は、True
と1
と同様に、同等と見なされます。 True
と1
は同じ値と見なされるため、同じセットに同時に存在できるのはそのうちの1つだけです。どちらがセットに追加されるかの順序に依存します。最初の行では、set1
が最初のセットとして使用されるため、結果セットで1
が取得されます。 2番目のセットでは、True
が最初のセットにあるため、True
が結果に含まれます。
https://docs.python.org/3/library/stdtypes.html#boolean-values セクション4.12.10を見るとブール値:
ブール値は、2つの定数オブジェクトFalseとTrueです。これらは、真理値を表すために使用されます(ただし、他の値も偽または真と見なすことができます)。数値コンテキスト(算術演算子の引数として使用する場合など)では、それぞれintegers 0および1のように動作します。
比較演算子(==
、!=
)は、ブール値True
およびFalse
に対して1と0に一致するように定義されています。
そのため、集合結合では、True
が既に新しい集合に含まれているかどうかを確認すると、真実の答えが得られます。
>>> True in {1}
True
>>> 1 in {True}
True