これが有効である理由を知りたいのですが:
set(range(10)) - set(range(5))
しかし、これは無効です:
set(range(10)) + set(range(5))
「+」は共通部分と和集合の両方を意味する可能性があるためですか?
これが有効である理由を知りたいのですが:
set(range(10)) - set(range(5))
しかし、これは無効です:
set(range(10)) + set(range(5))
「+」は共通部分と和集合の両方を意味する可能性があるためですか?
~
二項演算子しかない場合は|
、+和集合と、~
はるかにバランスの取れた差を求めることができます。
回答:
Pythonセットには、+
演算子の実装がありません。
|
セットユニオンと&
セット交差に使用できます。
セットは-
、セットの差として実装されます。^
対称セット差にも使用できます(つまり、1つのセットに表示されるが、両方のセットには表示されないオブジェクトのみを含む新しいセットを返します)。
セットユニオンはブール論理和に密接に関連する概念|
である+
ため、Pythonは代わりに使用することを選択しました。ビットベクトル(Pythonではint
/ long
)は、ブール値のシーケンス全体でこの操作を定義し、「ビット単位または」と呼びます。実際、この操作は集合の和集合に非常に似ているため、2進整数は「ビットセット」とも呼ばれ、集合内の要素は自然数と見なされます。
ためint
既にとしてセット様演算子を定義し|
、&
そして^
、それが新しいため、天然たset
同じインターフェースを使用するタイプ。
集合論では、+記号は通常、2つの集合の非交和を示します。AとBが集合である場合、それらの非交和は集合であると定義されます。
A + B = {(a, 1) | a in A} U {(b, 2) | b in B}
つまり、非交和を構築するために、Aのすべての要素とBのすべての要素に異なるタグを付けます(この例では、番号1と2を使用しましたが、2つの異なる「もの」が機能します)。結果として得られる2つのセットの和集合。上記の例では、集合和集合に「U」を使用して、通常の数学表記に近づけています。以下では、Python表記、つまり「|」を使用しています。和集合の場合は「&」、共通部分の場合は「&」。
AとBが互いに素である場合、A + BはA |と1対1で対応します。B.そうでない場合、AとBのすべての共通要素xはA + Bに2回表示されます。1回は(x、1)として、もう1回は(x、2)として表示されます。
したがって、「+」記号は集合演算として非常に確立された意味を持っているので、Pythonがこの記号を集合の和集合または共通部分に使用しないことは非常に一貫していることがわかります。おそらくPython設計者は、集合演算子を選択したときにこれを念頭に置いていました。
|
が集合和集合の演算子をオーバーロードした理由を理解しましたが、Guidoが集合和集合の演算子のオーバーロードを回避した理由を理解できませんでした+
。結局のところ、そうすることで、+
リストの追加のためにオーバーロードされた演算子との直交性が維持されます。Pythonの特徴は数学表記(たとえば、j
複素数の複素数成分を表す)に準拠しているため、Guidoの奇妙な選択はついに理にかなっています。
なぜなら|
、和集合を&
意味し、交差を意味するからです。同じ関数に複数の演算子を追加する理由は明らかにありません。
使用する理由は|
、&
おそらくビット演算に戻ります。セットを数値のビットとして表す場合、それらは和集合と共通部分を実行するために使用する演算子です。
+
単純なものは、組合に縛られるほどではなく、-
違いを設定することです。
ので、セットの違いは非常に有用であると一般的に知られた概念であるが、「セット追加」のない(一般的に使用)という概念はありません。
+
として定義されることもあります。対称差に使用するものもあります。いずれにせよ、それを使用する紙はそれを他の何かと呼ぶか、最初に定義します。
|
和集合を意味します。何を聞いているんですか?