ฉันต้องการทราบว่าเหตุใดจึงถูกต้อง:
set(range(10)) - set(range(5))
แต่ไม่ถูกต้อง:
set(range(10)) + set(range(5))
เป็นเพราะ '+' อาจหมายถึงทั้งจุดตัดและสหภาพ?
ฉันต้องการทราบว่าเหตุใดจึงถูกต้อง:
set(range(10)) - set(range(5))
แต่ไม่ถูกต้อง:
set(range(10)) + set(range(5))
เป็นเพราะ '+' อาจหมายถึงทั้งจุดตัดและสหภาพ?
~
เป็นเพียงตัวดำเนินการไบนารีคุณสามารถมี|
สำหรับ + union และ~
สำหรับความแตกต่างซึ่งสมดุลกว่ามาก
คำตอบ:
ชุด Python ไม่มีการใช้งานสำหรับตัว+
ดำเนินการ
คุณสามารถใช้|
สำหรับเซตยูเนี่ยนและ&
สำหรับจุดตัดชุด
ชุดจะใช้-
เป็นความแตกต่างของชุด คุณยังสามารถใช้^
สำหรับความแตกต่างของชุดสมมาตร (กล่าวคือจะส่งคืนชุดใหม่โดยมีเฉพาะวัตถุที่ปรากฏในชุดเดียว แต่ไม่ปรากฏในทั้งสองชุด)
Python เลือกที่จะใช้|
แทน+
เนื่องจาก set union เป็นแนวคิดที่เกี่ยวข้องอย่างใกล้ชิดกับการแยกบูลีน เวกเตอร์บิต (ซึ่งใน python เป็นเพียงint
/ long
) กำหนดการดำเนินการนี้ในลำดับของค่าบูลีนและเรียกมันว่า "bitwise หรือ" ในความเป็นจริงการดำเนินการนี้คล้ายกับยูเนี่ยนเซตที่จำนวนเต็มไบนารีบางครั้งเรียกอีกอย่างว่า "ชุดบิต" ซึ่งองค์ประกอบในเซตจะถูกนำไปเป็นจำนวนธรรมชาติ
เนื่องจากint
ได้กำหนดตัวดำเนินการแบบ set-like ไว้|
แล้ว&
และ^
เป็นเรื่องปกติสำหรับset
ประเภทที่ใหม่กว่าที่จะใช้อินเทอร์เฟซเดียวกัน
ในทฤษฎีเซตสัญลักษณ์ + โดยปกติจะบ่งบอกถึงการรวมกันที่ไม่ปะติดปะต่อของสองชุด ถ้า 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 อาจมีความคิดนี้เมื่อพวกเขาเลือกตัวดำเนินการชุด
|
สำหรับการจัดตั้งสหภาพแรงงาน แต่ก็ล้มเหลวที่จะเอะอะว่าทำไมกุยโดจึงหลีกเลี่ยงไม่ให้+
ผู้ปฏิบัติงานบรรทุกเกินพิกัดสำหรับสหภาพแรงงานชุดนี้ด้วย ท้ายที่สุด+
การทำเช่นนั้นจะคงความเป็นมุมฉากไว้กับตัวดำเนินการที่มีงานมากเกินไปสำหรับการเพิ่มรายการ เนื่องจากจุดเด่นของ Python สอดคล้องกับสัญกรณ์ทางคณิตศาสตร์ (เช่นj
แสดงถึงองค์ประกอบที่ซับซ้อนของจำนวนเชิงซ้อน) ทางเลือกที่น่าสนใจของ Guido จึงสมเหตุสมผลในที่สุด
แน่นอนว่าพวกเขาเคย+
ทำสหภาพ แต่ตอนนั้นก็ยังต้องการสัญลักษณ์สำหรับจุดตัด |
สำหรับการรวมกันนั้นสมมาตรกับ&
จุดตัดจึงเป็นทางเลือกที่ดีกว่า
เพราะ|
หมายถึงสหภาพและ&
หมายถึงจุดตัด ไม่มีเหตุผลชัดเจนที่จะเพิ่มตัวดำเนินการหลายตัวสำหรับฟังก์ชันเดียวกัน
เหตุผลในการใช้|
และ&
อาจกลับไปใช้การดำเนินการแบบบิต หากคุณแทนเซตเป็นบิตในตัวเลขเหล่านี้คือตัวดำเนินการที่คุณใช้ทำยูเนี่ยนและตัดกัน
+
ความเรียบง่ายไม่ได้ผูกติดอยู่กับการรวมกันและ-
คือการกำหนดความแตกต่าง
เนื่องจากความแตกต่างของเซตเป็นแนวคิดที่มีประโยชน์และเป็นที่รู้จักกันทั่วไป แต่ไม่มีแนวคิด "การเพิ่มเซต" (ที่ใช้กันทั่วไป)
+
มีการกำหนดเป็นนอกจากนี้สมาชิกที่ชาญฉลาด บางคนใช้มันสำหรับความแตกต่างสมมาตร ไม่ว่าจะด้วยวิธีใดกระดาษใด ๆ ที่ใช้กระดาษจะเรียกมันว่าอย่างอื่นหรือกำหนดไว้ก่อน
|
หมายถึงสหภาพแรงงาน คุณจะถามอะไร?