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 |?


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.


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])

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.


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])

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.


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

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.


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


menggunakan pemahaman daftar untuk efek samping dan dengan param anonim adalah praktik yang sangat buruk.
Jean-François Fabre
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.