Python kümeleri '+' neden anlaşılmıyor?


91

Bunun neden geçerli olduğunu bilmek istiyorum:

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

ancak bu geçerli değil:

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

"+" Hem kesişim hem de birleşme anlamına gelebildiği için mi?


3
|birlik demektir. Ne soruyorsun?
S.Lott

14
Çünkü Guido, kavşak ve birleşim için farklı operatörler seçti.
David Heffernan

3
@David Heffernan, Guido işleri genellikle sebepsiz veya en azından bazı yol gösterici ilkeler olmadan yapmaz - Python'u bu kadar harika yapan da budur.
Mark Ransom

1
@Mark Oh, eminim iyi bir sebeple yaptı.
David Heffernan

1
Keşke ~bir ikili operatör olsaydı , o zaman |için + birleşim ve ~çok daha dengeli olan fark için sahip olabilirsiniz .
Matt Joiner

Yanıtlar:


113

Python kümelerinin +işleç için bir uygulaması yoktur .

|Set birleşimi ve &set kesişimi için kullanabilirsiniz .

Kümeler -, küme farkı olarak uygular . ^Simetrik set farkı için de kullanabilirsiniz (yani, sadece bir sette görünen ancak her iki sette de görünmeyen nesnelerle yeni bir set döndürecektir).


2
Teşekkürler. Bilmiyordum | ve &.
badzil

100

Python |bunun yerine kullanmayı seçti +çünkü set birliği, boole ayrışması ile yakından ilgili bir kavramdır; Bit vektörleri (python'da sadece int/ şeklindedir long) bu işlemi bir dizi boole değerinde tanımlar ve "bitsel veya" olarak adlandırır. Aslında bu işlem küme birliğine o kadar benzer ki, ikili tamsayılar bazen "Bit kümeleri" olarak da adlandırılır, burada kümedeki elemanlar doğal sayılar olarak alınır.

Çünkü intönce operatörler grubu gibi tanımlar |, &ve ^yeni için, doğal olarak settürü aynı arayüzü.


7
Sanırım bu yanıt, sorudaki "neden" konusuna daha iyi hitap ediyor.
Greg Hendershott

1
Muhtemelen. Nedeni için +1. Ancak bir anlamda soruyu soran kişi, en azından nasıl birleşme ve kesişim yapılacağını bilmekten memnun görünüyordu.
Platinum Azure

2
@ Platinum: Aslında sorulan soruya cevap vermeyi seviyorum, bu yüzden bu soruyu soran başka biri geldiğinde tüm makul cevapları görebilir; orijinal soruyu soran kişi devam etse bile. Aramızda kalsın, buna iyi cevap veriyoruz.
SingleNegationElimination

1
@TokenMacGuy: "Çünkü Python operatörü tanımlamadı" da nedenini yanıtlıyor. :-P
Platinum Azure

15
Öyle olduğundan emin değilim; "Mavi olduğu için", "Gökyüzü neden mavi?"
SingleNegationElimination

36

Küme teorisinde + sembolü normalde iki kümenin ayrık birleşimini gösterir . A ve B kümelerse, ayrık birleşimleri küme olarak tanımlanır

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

yani, ayrık birleşimi oluşturmak için, A'nın tüm öğelerini ve B'nin tüm öğelerini farklı etiketlerle işaretleriz (örnekte 1 ve 2 sayılarını kullandım, ancak herhangi iki farklı "şey" işi yapar) ve sonra ortaya çıkan iki kümenin birleşimi. Yukarıdaki örnekte, olağan matematiksel gösterime daha benzer hale getirmek için set birleşimi için 'U' kullandım; aşağıda Python gösterimini kullanıyorum, yani '|' birlik için ve kesişim için '&'.

A ve B ayrıksa, A + B'nin A | ile 1'e 1 yazışması vardır. B. Değilse, A ve B'deki tüm ortak elemanlar A + B'de iki kez görünür: bir kez (x, 1) ve bir kez (x, 2) olarak.

Bu nedenle, '+' sembolünün küme işlemi olarak oldukça iyi belirlenmiş bir anlamı olduğundan, Python'un bu sembolü set birleşimi veya kesişim için kullanmadığını çok tutarlı buluyorum. Muhtemelen Python tasarımcıları set operatörlerini seçerken bunu akıllarında tutmuşlardır.


5
Bu en uygun cevaptır. Bu yanıtı okuyana kadar, Guido'nun neden |operatörü ayarlı birlikler için aşırı yüklediğini anladım, ancak Guido'nun neden operatörü set bağlantıları için aşırı yüklemekten kaçındığını anlayamadım +. Sonuçta, bunu yapmak, +operatörün liste eklemeleri için aşırı yüklenmesi ile ortogonaliteyi koruyacaktı . Python'un ayırt edici özelliği matematiksel gösterime uygunluk olduğu için (örneğin, jkarmaşık sayıların karmaşık bileşenini belirtmek), Guido'nun meraklı seçimi nihayet mantıklıdır.
Cecil Curry

23

Elbette, eskiden bir birliktelik yapabilirlerdi +, ancak yine de kesişme için bir sembole ihtiyaç duyacaklardı. |birleşim &için kesişme için simetriktir ve bu nedenle daha iyi bir seçim yapar.


10

Çünkü |birlik demektir ve &kesişme demektir. Aynı işlev için birden fazla operatör eklemenin açıkça bir nedeni yoktur.

Kullanım nedenleri |ve &muhtemelen bitsel işlemlere geri dönüyor. Bir kümeyi bir sayıdaki bitler olarak temsil ediyorsanız, bunlar birleştirmek ve kesişmek için kullanacağınız işleçlerdir.

+basit, birliğe bağlı değildir ve -farklılığı belirlemektir.


3

Çünkü küme farkı çok kullanışlı ve yaygın olarak bilinen bir kavramdır, ancak (evrensel olarak kullanılan) "küme toplama" kavramı yoktur.


1
Birlik? En son ne zaman birinin "birleşim" yerine "toplama ayarla" dediğini veya ∪? Yerine + kullandığını duydunuz. Bazen üye bazında toplama+ olarak tanımlanır . Bazıları bunu simetrik farklılık için kullanır . Her iki durumda da, onu kullanan herhangi bir kağıt ona ya başka bir şey diyor ya da önce onu tanımlıyor.
Petr Viktorin

1
Doğru terimi bilmeyen biri buna 'set ekleme' olarak başvurabilir. Açıkçası 'sendika' terimini bilen insanlar 'sendika' terimini kullanıyor.
kabarık
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.