Mengapa '+' tidak dipahami oleh set Python?


90

Saya ingin tahu mengapa ini valid:

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

tapi ini tidak valid:

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

Apakah karena '+' bisa berarti persimpangan dan persatuan?


3
|berarti persatuan. Apa yang kamu tanyakan?
S. Lotot

13
Itu karena Guido memilih operator yang berbeda untuk persimpangan dan persatuan.
David Heffernan

3
@David Heffernan, Guido biasanya tidak melakukan sesuatu tanpa alasan atau setidaknya beberapa prinsip panduan - itulah yang membuat Python begitu hebat.
Tandai Tebusan

1
@ Mark Oh, saya cukup yakin dia melakukannya karena alasan yang bagus.
David Heffernan

1
Jika hanya ~operator biner, maka Anda dapat memiliki |+ union, dan ~untuk perbedaan, yang jauh lebih seimbang.
Matt Joiner

Jawaban:


109

Set Python tidak memiliki implementasi untuk +operator.

Anda dapat menggunakan |untuk set union dan &set intersection.

Set melakukan implementasi -sebagai set perbedaan. Anda juga dapat menggunakan ^untuk perbedaan himpunan simetris (yaitu, ia akan mengembalikan himpunan baru dengan hanya objek yang muncul dalam satu himpunan tetapi tidak muncul di kedua himpunan).


2
Terima kasih. Saya tidak tahu tentang | dan &.
badzil

99

Python memilih untuk menggunakan |daripada +karena set union adalah konsep yang terkait erat dengan disjungsi boolean; Vektor bit (yang dalam python hanya int/ long) mendefinisikan operasi ini di seluruh urutan nilai boolean dan menyebutnya "bitwise atau". Nyatanya, operasi ini sangat mirip dengan kumpulan himpunan sehingga bilangan bulat biner terkadang juga disebut "Himpunan bit", di mana elemen dalam himpunan dianggap sebagai bilangan asli.

Karena intsudah mendefinisikan operator set-like sebagai |, &dan ^, wajar jika settipe yang lebih baru menggunakan antarmuka yang sama.


7
Saya pikir jawaban ini lebih baik menjawab pertanyaan "mengapa".
Greg Hendershott

1
Mungkin. 1 untuk alasannya. Namun di satu sisi, setidaknya penanya pertanyaan tampak puas hanya dengan mengetahui bagaimana melakukan penyatuan dan persimpangan.
Platinum Azure

2
@Platinum: Saya suka menjawab pertanyaan yang sebenarnya ditanyakan, jadi ketika ada orang lain yang memiliki pertanyaan itu yang datang, saya dapat melihat semua jawaban yang masuk akal; meskipun orang yang menanyakan pertanyaan awal sudah pindah. Di antara kami berdua, kami menjawabnya dengan baik.
SingleNegationElimination

1
@TokenMacGuy: "Karena Python tidak mendefinisikan operator" juga menjawab alasannya. :-P
Platinum Azure

15
Saya tidak yakin begitu; "Karena itu biru" tidak menjelaskan "Mengapa langit berwarna biru?"
SingleNegationElimination

36

Dalam teori himpunan, simbol + biasanya menunjukkan gabungan dua himpunan yang terputus - putus . Jika A dan B adalah himpunan, pemutusan hubungan mereka didefinisikan sebagai himpunan

A + B = {(a, 1) | a in A} U {(b, 2) | b in B}

yaitu, untuk membangun persatuan terputus-putus, kita menandai semua elemen A dan semua elemen B dengan tag yang berbeda (dalam contoh ini saya menggunakan angka 1 dan 2, tetapi dua "hal" yang berbeda akan melakukan pekerjaan itu) dan kemudian mengambil penyatuan dua set yang dihasilkan. Dalam contoh di atas, saya telah menggunakan 'U' untuk kumpulan himpunan agar lebih mirip dengan notasi matematika biasa; di bawah ini saya menggunakan notasi Python, yaitu '|' untuk persatuan, dan '&' untuk persimpangan.

Jika A dan B terputus-putus, A + B memiliki korespondensi 1-ke-1 dengan A | B. Jika tidak, maka semua elemen persekutuan x di A & B muncul dua kali di A + B: sekali sebagai (x, 1), dan sekali sebagai (x, 2).

Jadi, karena simbol '+' memiliki arti yang cukup mapan sebagai operasi himpunan, saya merasa sangat konsisten bahwa Python tidak menggunakan simbol ini untuk persatuan atau persimpangan himpunan. Mungkin perancang Python memikirkan hal ini ketika mereka memilih operator set.


5
Ini adalah jawaban yang optimal. Sampai membaca tanggapan ini, saya bingung mengapa Guido membebani |operator untuk serikat yang ditetapkan tetapi gagal menjelaskan mengapa Guido menghindari membebani +operator untuk serikat yang ditetapkan juga. Lagi pula, melakukan hal itu akan menjaga ortogonalitas dengan +operator kelebihan beban untuk penambahan daftar. Karena ciri khas Python adalah kesesuaian dengan notasi matematika (misalnya, jmenunjukkan komponen kompleks dari bilangan kompleks), pilihan penasaran Guido akhirnya masuk akal.
Cecil Curry

23

Tentu, mereka bisa dulu +melakukan persatuan, tapi kemudian masih membutuhkan simbol untuk persimpangan. |karena penyatuan simetris dengan &for intersection dan dengan demikian membuat pilihan yang lebih baik.


10

Karena |berarti persatuan dan &berarti persimpangan. Jelas tidak ada alasan untuk menambahkan beberapa operator untuk fungsi yang sama.

Alasan untuk menggunakan |dan &mungkin kembali ke operasi bitwise. Jika Anda merepresentasikan suatu himpunan sebagai bit dalam sebuah angka, itu adalah operator yang akan Anda gunakan untuk melakukan penyatuan dan perpotongan.

+sederhana tidak terikat pada persatuan dan -mengatur perbedaan.


3

Karena perbedaan himpunan adalah konsep yang sangat berguna dan umum dikenal, tetapi tidak ada (digunakan secara universal) konsep "penambahan himpunan".


1
Persatuan? Kapan terakhir kali Anda mendengar seseorang mengatakan "setel tambahan" daripada "serikat", atau gunakan + sebagai ganti ∪ ?. Kadang +- kadang didefinisikan sebagai penambahan berdasarkan anggota . Beberapa menggunakannya untuk perbedaan simetris . Either way, kertas apa pun yang menggunakannya akan menyebutnya sesuatu yang lain atau mendefinisikannya terlebih dahulu.
Petr Viktorin

1
Seseorang mungkin menyebutnya sebagai 'set tambahan' jika mereka tidak mengetahui istilah yang tepat. Jelas orang yang tahu istilah 'serikat' menggunakan istilah 'serikat pekerja.'
lembut
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.