1. ホーム
  2. python

[解決済み] 2つの集合の和は、すべての項目を含んでいない

2023-02-28 10:08:40

質問

下の組合の2つのセットの順番を変えると、どうして違う結果になるのでしょうか?

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

どの等価値を使うか

複数の等価値がある場合、最初に見たものを保持します。

>>> {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 正規表現と区別してキャッシュされるように強制するために使われています。このテクニックは Python 3 の functools.lru_cache() で typed パラメータが true のときにも使われます。

もしOPがデフォルトの等価関係以外のものを必要とするならば、何か新しい関係を定義する必要があります。使用事例によっては、文字列の大文字と小文字の区別、Unicode の正規化、視覚的外観 (異なるものは異なると見なされる)、同一性 (2 つの異なるオブジェクトは等しいと見なされない)、値/型のペア、または等価関係を定義する他の関数があります。OP の具体的な例を考えると、彼/彼女は型による区別か視覚的な区別のどちらかを期待していたようです。