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


回答:


110

union()にすべてのアイテムが含まれていない理由

同等と重複していると考えられます。同様におよびも同等です:1True0False

>>> 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 == 0True == 1Decimal(8.5) == 8.5)。技術は、そうでなければ同等のSTR正規表現から明らかにキャッシュするユニコード正規表現を強制するためのPython 2.7の正規表現モジュールに使用される。技法はPythonでも使用されます型付きパラメーターがtrueの場合、functools.lru_cache()の場合は3。

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


20

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


6

https://docs.python.org/3/library/stdtypes.html#boolean-valuesセクション4.12.10 をご覧ください。ブール値:

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


4

比較演算子(==!=)ブール値に対して定義されTrueかつFalse1と0と一致します。

これが、セットユニオンTrueで、が新しいセットに既にあるかどうかを確認するときに真実の答えを得る理由です。

>>> True in {1}
True
>>> 1 in {True}
True
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.