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.