ฉันต้องการทราบว่าเหตุใดจึงถูกต้อง:
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 จึงสมเหตุสมผลในที่สุด
แน่นอนว่าพวกเขาเคย+ทำสหภาพ แต่ตอนนั้นก็ยังต้องการสัญลักษณ์สำหรับจุดตัด |สำหรับการรวมกันนั้นสมมาตรกับ&จุดตัดจึงเป็นทางเลือกที่ดีกว่า
เพราะ|หมายถึงสหภาพและ&หมายถึงจุดตัด ไม่มีเหตุผลชัดเจนที่จะเพิ่มตัวดำเนินการหลายตัวสำหรับฟังก์ชันเดียวกัน
เหตุผลในการใช้|และ&อาจกลับไปใช้การดำเนินการแบบบิต หากคุณแทนเซตเป็นบิตในตัวเลขเหล่านี้คือตัวดำเนินการที่คุณใช้ทำยูเนี่ยนและตัดกัน
+ความเรียบง่ายไม่ได้ผูกติดอยู่กับการรวมกันและ-คือการกำหนดความแตกต่าง
เนื่องจากความแตกต่างของเซตเป็นแนวคิดที่มีประโยชน์และเป็นที่รู้จักกันทั่วไป แต่ไม่มีแนวคิด "การเพิ่มเซต" (ที่ใช้กันทั่วไป)
+มีการกำหนดเป็นนอกจากนี้สมาชิกที่ชาญฉลาด บางคนใช้มันสำหรับความแตกต่างสมมาตร ไม่ว่าจะด้วยวิธีใดกระดาษใด ๆ ที่ใช้กระดาษจะเรียกมันว่าอย่างอื่นหรือกำหนดไว้ก่อน
|หมายถึงสหภาพแรงงาน คุณจะถามอะไร?