「|」を使用せずに2つのセットを1行で結合する方法


171

STが割り当てられていると仮定します。結合演算子を使用せず|に、2つのセットの結合を見つけるにはどうすればよいですか?たとえば、これは交差点を見つけます。

S = {1, 2, 3, 4}
T = {3, 4, 5, 6}
S_intersect_T = { i for i in S if i in T }

では、使用せずに2つのセットの和集合を1行で見つけるにはどうすればよい|ですか?


1
結合する必要がありますか?はいの場合、s.union(t)を実行できます
アンスマンベバルタ2013

59
なぜ使えないの|
Scott Bartell 2014

1
使用しない一般的な理由はあります|か?
matanster

5
理由の1つは、関数の引数として集合演算を渡すことです。次のような関数を想像してみてくださいdef apply_set_operation(a, b, set_operation)。この関数を呼び出すときは、次のようにapply_set_operation(a, b, set.union)しますapply_set_operation(a, b, set.__or__)
bsa '20

回答:


309

セットにはユニオンメソッドを使用できます。 set.union(other_set)

新しいセットを返すことに注意してください。つまり、それ自体は変更されません。


54
しかし、|変数のインラインを変更することができます:set_a |= set_b
jorgenkg

13
@jorgenkgと同じ:set_a = set_a.union(set_b)。「インプレース」を意味する場合、どちらもそれを行うことはありません。どちらも新しいものを作成しますset
2016年

3
@jorgenkgは新しいセットを作成し、参照を置き換えます。
Alvaro

3
@Alvaro @nitelyの簡単なテストによると、、@ a = set((1, 2, 3,)); b = set((1, 3, 4,)); id_a = id(a); a |= b; assert id_a == id(a)jorgenkgは正しい-変数aはインラインで変更されます。何か不足していますか?
johndodo 2018年

3
いいえ、そのようには見えません:a = set((1, 2, 3,)); b = set((1, 3, 4,)); c = a; a |= b; assert id(c) == id(a)a破壊されたとしても、破壊cされなかったでしょう。また、cset([1, 2, 3, 4])なので、@ jorgenkgのコメントは正しいです。
johndodo 2018年

45

or_エイリアスを使用できます:

>>> from operator import or_
>>> from functools import reduce # python3 required
>>> reduce(or_, [{1, 2, 3, 4}, {3, 4, 5, 6}])
set([1, 2, 3, 4, 5, 6])

9
このアプローチが大好きで、より機能的で、2つ以上のセットに適用できます。
Colin Su

42

元のセットを変更することに問題がない場合(場合によってはこれを行うこともできます)、次を使用できますset.update()

S.update(T)

戻り値はNoneですがS、元のSとの和集合になるように更新されますT


23

あなたも使用できないと仮定するとs.union(t)、これはと同等s | tです

>>> from itertools import chain
>>> set(chain(s,t))
set([1, 2, 3, 4, 5, 6])

または、理解が必要な場合は、

>>> {i for j in (s,t) for i in j}
set([1, 2, 3, 4, 5, 6])

14

結合によってあなたが組合を意味するなら、これを試してください:

set(list(s) + list(t))

それは少しハックですが、私はそれを行うためのより良いワンライナーを考えることができません。


set(list(s)+ list(t))を使用すると、ユニオンを実行する場合と同じ結果が得られます。
Ansuman Bebarta 2013

私は承知していますが、組み込みのPython関数の使用を避けようとしていたようです。オペレーター。
BenjaminCohen

listsetPython関数に組み込まれています
whackamadoodle3000

10

2つのリストがあるとします

 A = [1,2,3,4]
 B = [3,4,5,6]

次のようにしてAUnion Bを見つけることができます

 union = set(A).union(set(B))

また、交差点と非交差点を見つけたい場合は、次のようにします

 intersection = set(A).intersection(set(B))
 non_intersection = union - intersection

7

両方のセットを次のように1つに解凍するだけです。

>>> set_1 = {1, 2, 3, 4}
>>> set_2 = {3, 4, 5, 6}
>>> union = {*set_1, *set_2}
>>> union
{1, 2, 3, 4, 5, 6}

*セットを解凍します。アンパックとは、イテラブル(たとえば、セットまたはリスト)が生成するすべてのアイテムとして表される場所です。つまり、セットには一意のアイテムしか含めることができないため、上記の例は単純化さ{1, 2, 3, 4, 3, 4, 5, 6}れ、次に単純化され{1, 2, 3, 4, 5, 6}ます。


*3行目で何をしますか?
altabq

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