Cara menggabungkan dua set dalam satu baris tanpa menggunakan "|"

171

Asumsikan itu Sdan Tditugaskan set. Tanpa menggunakan operator gabungan |, bagaimana saya bisa menemukan gabungan dari dua set? Ini, misalnya, menemukan persimpangan:

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

Jadi bagaimana saya bisa menemukan penyatuan dua set dalam satu baris tanpa menggunakan |?

fandyst
sumber
1
apakah Anda perlu bersatu? Jika ya maka Anda dapat melakukan s.union (t)
Ansuman Bebarta
59
Kenapa kamu tidak bisa menggunakan |?
Scott Bartell
1
Adakah alasan umum untuk tidak menggunakan |?
matanster
5
Salah satu alasan mungkin melewati operasi yang ditetapkan sebagai argumen fungsi. Bayangkan fungsi, seperti: def apply_set_operation(a, b, set_operation). Saat memanggil fungsi ini, saya lebih suka apply_set_operation(a, b, set.union)untukapply_set_operation(a, b, set.__or__)
bsa

Jawaban:

309

Anda dapat menggunakan metode gabungan untuk set: set.union(other_set)

Perhatikan bahwa ia mengembalikan set baru yaitu tidak memodifikasi sendiri.

ovrwngtvity
sumber
54
Namun, |dapat memodifikasi variabel sebaris:set_a |= set_b
jorgenkg
13
@jorgenkg sama seperti: set_a = set_a.union(set_b). Jika Anda berarti "di tempat", tidak akan melakukan itu, baik buat baruset
nitely
3
@ jorgenkg masih membuat set baru dan menggantikan referensi.
Alvaro
3
@Alvaro @ tentu saja berdasarkan tes sederhana a = set((1, 2, 3,)); b = set((1, 3, 4,)); id_a = id(a); a |= b; assert id_a == id(a):, @jorgenkg benar - variabel adimodifikasi sebaris. Apakah saya melewatkan sesuatu?
johndodo
3
Tidak, tidak terlihat seperti itu: a = set((1, 2, 3,)); b = set((1, 3, 4,)); c = a; a |= b; assert id(c) == id(a). Bahkan jika adihancurkan, ctidak akan terjadi. Juga, csekarang set([1, 2, 3, 4]), jadi komentar @ jorgenkg benar.
johndodo
45

Anda bisa menggunakan or_alias:

>>> 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])
Alexander Klimenko
sumber
9
suka pendekatan ini, lebih fungsional, dan bisa diterapkan ke 2 set atau lebih.
Colin Su
42

Jika Anda setuju dengan memodifikasi set asli (yang mungkin ingin Anda lakukan dalam beberapa kasus), Anda dapat menggunakan set.update():

S.update(T)

Nilai pengembaliannya adalah None, tetapi Sakan diperbarui menjadi penyatuan yang asli Sdan T.

Max Candocia
sumber
23

Dengan asumsi Anda juga tidak dapat menggunakan s.union(t), yang setara dengan s | t, Anda dapat mencoba

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

Atau, jika Anda ingin pemahaman,

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

Jika dengan bergabung dengan Anda maksud penyatuan, coba ini:

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

Ini sedikit hack, tapi saya tidak bisa memikirkan yang lebih baik untuk melakukannya.

BenjaminCohen
sumber
set (daftar) + daftar (t)) akan memberi Anda hasil yang sama jika Anda akan melakukan penyatuan.
Ansuman Bebarta
Saya sadar, tapi sepertinya dia berusaha menghindari penggunaan fungsi python bawaan, kalau tidak dia hanya akan menggunakan | operator.
BenjaminCohen
listdan setdibangun dalam fungsi python
whackamadoodle3000
10

Misalkan Anda memiliki 2 daftar

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

sehingga Anda dapat menemukan AUnion Bsebagai berikut

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

juga jika Anda ingin menemukan persimpangan dan non-persimpangan Anda melakukannya sebagai berikut

 intersection = set(A).intersection(set(B))
 non_intersection = union - intersection
iyogeshjoshi
sumber
7

Anda bisa membongkar kedua set menjadi satu seperti ini:

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

The *membongkar set. Bongkar adalah tempat iterable (misalnya satu set atau daftar) diwakili karena setiap item yang dihasilkannya. Ini berarti contoh di atas menyederhanakan {1, 2, 3, 4, 3, 4, 5, 6}yang kemudian disederhanakan {1, 2, 3, 4, 5, 6}karena set hanya dapat berisi item unik.

Jamie Saunders
sumber
Apa yang *dilakukan di baris 3?
altabq
5

Anda dapat melakukan unionatau daftar pemahaman sederhana

[A.add(_) for _ in B]

A akan memiliki semua elemen B

Vaibhav Mishra
sumber
menggunakan pemahaman daftar untuk efek samping dan dengan param anonim adalah praktik yang sangat buruk.
Jean-François Fabre