'+'がPythonセットで理解されないのはなぜですか?


91

これが有効である理由を知りたいのですが:

set(range(10)) - set(range(5))

しかし、これは無効です:

set(range(10)) + set(range(5))

「+」は共通部分と和集合の両方を意味する可能性があるためですか?


3
|和集合を意味します。何を聞いているんですか?
S.Lott 2011年

13
これは、Guidoが共通部分と和集合に異なる演算子を選択したためです。
David Heffernan 2011年

3
@David Heffernan、Guidoは通常、理由や少なくともいくつかの指針なしに物事を行うことはありません。それがPythonを非常に優れたものにしている理由です。
Mark Ransom

1
@マークああ、彼は正当な理由でそれをしたと確信しています。
David Heffernan 2011年

1
~二項演算子しかない場合は|、+和集合と、~はるかにバランスの取れた差を求めることができます。
マットジョイナー2011年

回答:


112

Pythonセットには、+演算子の実装がありません。

|セットユニオンと&セット交差に使用できます。

セットは-、セットの差として実装されます。^対称セット差にも使用できます(つまり、1つのセットに表示されるが、両方のセットには表示されないオブジェクトのみを含む新しいセットを返します)。


2
ありがとう。知らなかった| および&。
badzil 2011年

100

セットユニオンはブール論理和に密接に関連する概念|である+ため、Pythonは代わりに使用することを選択しました。ビットベクトル(Pythonではint/ long)は、ブール値のシーケンス全体でこの操作を定義し、「ビット単位または」と呼びます。実際、この操作は集合の和集合に非常に似ているため、2進整数は「ビットセット」とも呼ばれ、集合内の要素は自然数と見なされます。

ためint既にとしてセット様演算子を定義し|&そして^、それが新しいため、天然たset同じインターフェースを使用するタイプ。


7
この回答は、質問の「理由」にうまく対応していると思います。
グレッグヘンダーショット2011年

1
多分。理由は+1。しかし、ある意味では、少なくとも質問者は、和集合と交差の方法を知っているだけで満足しているように見えました。
プラチナアズール

2
@Platinum:私は実際に尋ねられた質問に答えるのが好きなので、その質問を持っている誰かがやってくると、すべての合理的な答えを見ることができます。元の質問をした人が先に進んだとしても。二人の間で、私たちはそれによく答えます。
singleNegationElimination 2011年

1
@TokenMacGuy:「Pythonは単に演算子を定義しなかったので」もその理由に答えます。:-P
プラチナアズール

15
そうかどうかはわかりません。「青いから」は「なぜ空が青いのか」を説明していません。
singleNegationElimination 2011年

36

集合論では、+記号は通常、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設計者は、集合演算子を選択したときにこれを念頭に置いていました。


5
これが最適な答えです。この応答を読むまで、私はGuido|が集合和集合の演算子をオーバーロードした理由を理解しましたが、Guidoが集合和集合の演算子のオーバーロードを回避した理由を理解できませんでした+。結局のところ、そうすることで、+リストの追加のためにオーバーロードされた演算子との直交性が維持されます。Pythonの特徴は数学表記(たとえば、j複素数の複素数成分を表す)に準拠しているため、Guidoの奇妙な選択はついに理にかなっています。
セシルカレー

23

確かに、彼らは以前+は結合を行うことができたかもしれませんが、それでも交差の記号が必要になります。|ユニオンの場合は&交差の場合と対称であるため、より適切な選択になります。


10

なぜなら|、和集合を&意味し、交差を意味するからです。同じ関数に複数の演算子を追加する理由は明らかにありません。

使用する理由は|&おそらくビット演算に戻ります。セットを数値のビットとして表す場合、それらは和集合と共通部分を実行するために使用する演算子です。

+単純なものは、組合に縛られるほどではなく、-違いを設定することです。


3

ので、セットの違いは非常に有用であると一般的に知られた概念であるが、「セット追加」のない(一般的に使用)という概念はありません。


1
連合?誰かが「和集合」の代わりに「足し算を設定」と言ったり、∪の代わりに+を使用したりするのを最後に聞いたのはいつですか。メンバーごとの加算+として定義されることもあります。対称差に使用するものもあります。いずれにせよ、それを使用する紙はそれを他の何かと呼ぶか、最初に定義します。
Petr Viktorin 2011年

1
適切な用語がわからない場合、誰かがそれを「セット追加」と呼ぶかもしれません。明らかに、「ユニオン」という用語を知っている人は「ユニオン」という用語を使用します。
ふわふわ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.