เหตุใดชุด Python จึงไม่เข้าใจ '+'


91

ฉันต้องการทราบว่าเหตุใดจึงถูกต้อง:

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

แต่ไม่ถูกต้อง:

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

เป็นเพราะ '+' อาจหมายถึงทั้งจุดตัดและสหภาพ?


3
|หมายถึงสหภาพแรงงาน คุณจะถามอะไร?
ล็อ

14
เป็นเพราะ Guido เลือกตัวดำเนินการที่แตกต่างกันสำหรับสี่แยกและสหภาพ
David Heffernan

3
@David Heffernan, Guido มักจะไม่ทำสิ่งต่างๆโดยไม่มีเหตุผลหรืออย่างน้อยก็มีหลักการชี้แนะนั่นคือสิ่งที่ทำให้ Python นั้นยอดเยี่ยมมาก
Mark Ransom

1
@ มาร์คโอฉันค่อนข้างแน่ใจว่าเขาทำมันด้วยเหตุผลที่ดี
David Heffernan

1
ถ้า~เป็นเพียงตัวดำเนินการไบนารีคุณสามารถมี|สำหรับ + ​​union และ~สำหรับความแตกต่างซึ่งสมดุลกว่ามาก
Matt Joiner

คำตอบ:


113

ชุด Python ไม่มีการใช้งานสำหรับตัว+ดำเนินการ

คุณสามารถใช้|สำหรับเซตยูเนี่ยนและ&สำหรับจุดตัดชุด

ชุดจะใช้-เป็นความแตกต่างของชุด คุณยังสามารถใช้^สำหรับความแตกต่างของชุดสมมาตร (กล่าวคือจะส่งคืนชุดใหม่โดยมีเฉพาะวัตถุที่ปรากฏในชุดเดียว แต่ไม่ปรากฏในทั้งสองชุด)


2
ขอบคุณ. ฉันไม่รู้เกี่ยวกับ | และ &.
badzil

100

Python เลือกที่จะใช้|แทน+เนื่องจาก set union เป็นแนวคิดที่เกี่ยวข้องอย่างใกล้ชิดกับการแยกบูลีน เวกเตอร์บิต (ซึ่งใน python เป็นเพียงint/ long) กำหนดการดำเนินการนี้ในลำดับของค่าบูลีนและเรียกมันว่า "bitwise หรือ" ในความเป็นจริงการดำเนินการนี้คล้ายกับยูเนี่ยนเซตที่จำนวนเต็มไบนารีบางครั้งเรียกอีกอย่างว่า "ชุดบิต" ซึ่งองค์ประกอบในเซตจะถูกนำไปเป็นจำนวนธรรมชาติ

เนื่องจากintได้กำหนดตัวดำเนินการแบบ set-like ไว้|แล้ว&และ^เป็นเรื่องปกติสำหรับsetประเภทที่ใหม่กว่าที่จะใช้อินเทอร์เฟซเดียวกัน


7
ฉันคิดว่าคำตอบนี้ช่วยตอบ "ทำไม" ในคำถามได้ดีกว่า
Greg Hendershott

1
อาจ. +1 สำหรับเหตุผล ในแง่หนึ่งอย่างน้อยผู้ถามก็ดูพอใจกับการรู้วิธีการรวมตัวกันและจุดตัด
Platinum Azure

2
@ แพลตตินั่ม: ฉันชอบที่จะตอบคำถามที่ถามจริงดังนั้นเมื่อมีคนอื่นเข้ามาซึ่งมีคำถามนั้นสามารถเห็นคำตอบที่สมเหตุสมผลทั้งหมด แม้ว่าคนที่ถามคำถามเดิมจะย้ายไปแล้วก็ตาม ระหว่างเราสองคนตอบโจทย์ได้ดี
SingleNegationElimination

1
@TokenMacGuy: "เพราะ Python ไม่ได้กำหนดตัวดำเนินการ" ก็ตอบเหตุผลเช่นกัน :-P
Platinum Azure

15
ฉันไม่แน่ใจว่ามันทำได้ "เพราะเป็นสีฟ้า" ไม่ได้อธิบายว่า "ทำไมท้องฟ้าถึงเป็นสีฟ้า"
SingleNegationElimination

36

ในทฤษฎีเซตสัญลักษณ์ + โดยปกติจะบ่งบอกถึงการรวมกันที่ไม่ปะติดปะต่อของสองชุด ถ้า A และ B เป็นเซตยูเนี่ยนที่ไม่ปะติดปะต่อกันจะถูกกำหนดให้เป็นเซต

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

กล่าวคือในการสร้างสหภาพที่ไม่ปะติดปะต่อเราทำเครื่องหมายองค์ประกอบทั้งหมดของ A และองค์ประกอบทั้งหมดของ B ด้วยแท็กที่แตกต่างกัน (ในตัวอย่างฉันใช้ตัวเลข 1 และ 2 แต่ "สิ่ง" ที่แตกต่างกันสองรายการจะทำงานได้) จากนั้นใช้ การรวมกันของสองชุดผลลัพธ์ ในตัวอย่างข้างต้นฉันได้ใช้ 'U' สำหรับ set union เพื่อให้คล้ายกับสัญกรณ์ทางคณิตศาสตร์ทั่วไปมากขึ้น ด้านล่างฉันใช้สัญกรณ์ Python คือ '|' สำหรับสหภาพและ '&' สำหรับจุดตัด

ถ้า A และ B ไม่ปะติดปะต่อกัน A + B จะมีการโต้ตอบแบบ 1 ต่อ 1 กับ A | B. ถ้าไม่ใช่องค์ประกอบทั่วไปทั้งหมด x ใน A & B จะปรากฏสองครั้งใน A + B: หนึ่งครั้งเป็น (x, 1) และอีกครั้งเป็น (x, 2)

ดังนั้นเนื่องจากสัญลักษณ์ '+' มีความหมายที่ค่อนข้างชัดเจนในการดำเนินการชุดฉันจึงพบว่ามันสอดคล้องกันมากที่ Python ไม่ได้ใช้สัญลักษณ์นี้สำหรับการรวมชุดหรือจุดตัด นักออกแบบ Python อาจมีความคิดนี้เมื่อพวกเขาเลือกตัวดำเนินการชุด


5
นี่คือคำตอบที่ดีที่สุด จนกระทั่งได้อ่านคำตอบนี้ฉันก็เอะใจว่าทำไมกุยโดถึงมีพนักงานมากเกินไป|สำหรับการจัดตั้งสหภาพแรงงาน แต่ก็ล้มเหลวที่จะเอะอะว่าทำไมกุยโดจึงหลีกเลี่ยงไม่ให้+ผู้ปฏิบัติงานบรรทุกเกินพิกัดสำหรับสหภาพแรงงานชุดนี้ด้วย ท้ายที่สุด+การทำเช่นนั้นจะคงความเป็นมุมฉากไว้กับตัวดำเนินการที่มีงานมากเกินไปสำหรับการเพิ่มรายการ เนื่องจากจุดเด่นของ Python สอดคล้องกับสัญกรณ์ทางคณิตศาสตร์ (เช่นjแสดงถึงองค์ประกอบที่ซับซ้อนของจำนวนเชิงซ้อน) ทางเลือกที่น่าสนใจของ Guido จึงสมเหตุสมผลในที่สุด
Cecil Curry

23

แน่นอนว่าพวกเขาเคย+ทำสหภาพ แต่ตอนนั้นก็ยังต้องการสัญลักษณ์สำหรับจุดตัด |สำหรับการรวมกันนั้นสมมาตรกับ&จุดตัดจึงเป็นทางเลือกที่ดีกว่า


10

เพราะ|หมายถึงสหภาพและ&หมายถึงจุดตัด ไม่มีเหตุผลชัดเจนที่จะเพิ่มตัวดำเนินการหลายตัวสำหรับฟังก์ชันเดียวกัน

เหตุผลในการใช้|และ&อาจกลับไปใช้การดำเนินการแบบบิต หากคุณแทนเซตเป็นบิตในตัวเลขเหล่านี้คือตัวดำเนินการที่คุณใช้ทำยูเนี่ยนและตัดกัน

+ความเรียบง่ายไม่ได้ผูกติดอยู่กับการรวมกันและ-คือการกำหนดความแตกต่าง


3

เนื่องจากความแตกต่างของเซตเป็นแนวคิดที่มีประโยชน์และเป็นที่รู้จักกันทั่วไป แต่ไม่มีแนวคิด "การเพิ่มเซต" (ที่ใช้กันทั่วไป)


1
ยูเนี่ยน? ครั้งสุดท้ายที่คุณได้ยินใครพูดว่า "set addition" แทนที่จะเป็น "union" หรือใช้ + แทน∪? บางครั้ง+มีการกำหนดเป็นนอกจากนี้สมาชิกที่ชาญฉลาด บางคนใช้มันสำหรับความแตกต่างสมมาตร ไม่ว่าจะด้วยวิธีใดกระดาษใด ๆ ที่ใช้กระดาษจะเรียกมันว่าอย่างอื่นหรือกำหนดไว้ก่อน
Petr Viktorin

1
อาจมีคนเรียกมันว่า 'set addition' หากพวกเขาไม่รู้จักคำศัพท์ที่เหมาะสม เห็นได้ชัดว่าคนที่รู้จักคำว่า 'union' ใช้คำว่า 'union'
ปุย
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.