Union of 2 ชุดไม่มีทุกรายการ


94

ทำไมเมื่อฉันเปลี่ยนลำดับของทั้งสองชุดในสหภาพแรงงานด้านล่างฉันจึงได้ผลลัพธ์ที่แตกต่างกัน

set1 = {1, 2, 3}
set2 = {True, False}

print(set1 | set2)
# {False, 1, 2, 3}

print(set2 | set1)
#{False, True, 2, 3}

คำตอบ:


110

เหตุใดสหภาพ () จึงไม่มีรายการทั้งหมด

1และTrueเทียบเท่าและถือว่าเป็นรายการที่ซ้ำกัน ในทำนองเดียวกัน0และFalseเทียบเท่าเช่นกัน:

>>> 1 == True
True
>>> 0 == False
True

ใช้ค่าเทียบเท่าใด

เมื่อพบค่าที่เทียบเท่าหลายค่าชุดจะเก็บค่าแรกที่เห็น:

>>> {0, False}
{0}
>>> {False, 0}
{False}

วิธีทำให้ค่าแตกต่างกัน

เพื่อให้ได้รับการปฏิบัติที่แตกต่างกันเพียงจัดเก็บไว้ใน(value, type)คู่:

>>> set1 = {(1, int), (2, int), (3, int)}
>>> set2 = {(True, bool), (False, bool)}
>>> set1 | set2
{(3, <class 'int'>), (1, <class 'int'>), (2, <class 'int'>),
 (True, <class 'bool'>), (False, <class 'bool'>)}
>>> set1 & set2
set()

อีกวิธีหนึ่งในการทำให้ค่าแตกต่างกันคือการจัดเก็บเป็นสตริง:

>>> set1 = {'1', '2', '3'}
>>> set2 = {'True', 'False'}
>>> set1 | set2
{'2', '3', 'False', 'True', '1'}
>>> set1 & set2
set()

หวังว่าสิ่งนี้จะช่วยไขปริศนาและแสดงให้เห็นทางไปข้างหน้า :-)


ได้รับการช่วยเหลือจากความคิดเห็น:

นี้เป็นเทคนิคมาตรฐานสำหรับการทำลาย cross-type เท่าเทียมกัน (เช่น0.0 == 0, True == 1และDecimal(8.5) == 8.5). เทคนิคที่ใช้ในการแสดงออกโมดูลหลาม 2.7 ปกติที่จะมีผลบังคับใช้ regexes Unicode จะถูกเก็บไว้อย่างชัดเจนจากเทียบเท่ามิฉะนั้น regexes Str. เทคนิคที่ใช้ในหลาม 3 สำหรับ functools.lru_cache () เมื่อพารามิเตอร์ที่พิมพ์เป็นจริง

หาก OP ต้องการสิ่งอื่นที่ไม่ใช่ความสัมพันธ์การเทียบเท่าเริ่มต้นจำเป็นต้องกำหนดความสัมพันธ์ใหม่ ขึ้นอยู่กับกรณีการใช้งานซึ่งอาจเป็นกรณีที่ไม่คำนึงถึงตัวพิมพ์สำหรับสตริงการทำให้เป็นมาตรฐานสำหรับ Unicode ลักษณะที่มองเห็น (สิ่งที่ดูแตกต่างกันถือว่าแตกต่างกัน) เอกลักษณ์ (ไม่มีวัตถุที่แตกต่างกันสองชิ้นที่ถือว่าเท่ากัน) คู่ค่า / ประเภทหรืออื่น ๆ ฟังก์ชันที่กำหนดความสัมพันธ์การเทียบเท่า จากตัวอย่างเฉพาะของ OPs ดูเหมือนว่าเขา / เธอคาดหวังความแตกต่างตามประเภทหรือความแตกต่างของภาพ


20

ใน Python Falseและ0ถือว่าเทียบเท่าเช่นเดียวกับTrueและ1. เนื่องจากTrueและ1ถือเป็นค่าเดียวกันจึงสามารถแสดงได้เพียงค่าเดียวในช่วงเวลาเดียวกัน อันไหนขึ้นอยู่กับลำดับที่เพิ่มเข้าไปในชุดในบรรทัดแรกset1จะใช้เป็นชุดแรกดังนั้นเราจึงได้1ชุดผลลัพธ์ ในชุดที่สองTrueอยู่ในชุดแรกดังนั้นจึงTrueรวมอยู่ในผลลัพธ์


6

หากคุณดูhttps://docs.python.org/3/library/stdtypes.html#boolean-valuesหัวข้อ 4.12.10 ค่าบูลีน:

ค่าบูลีนเป็นสองคงวัตถุเท็จและทรู ใช้เพื่อแสดงค่าความจริง (แม้ว่าค่าอื่น ๆ อาจถือได้ว่าเป็นเท็จหรือเป็นจริง) ในบริบทที่เป็นตัวเลข (ตัวอย่างเช่นเมื่อใช้เป็นอาร์กิวเมนต์ของตัวดำเนินการทางคณิตศาสตร์) พวกเขาจะทำงานเหมือนจำนวนเต็ม 0 และ 1ตามลำดับ


4

ตัวดำเนินการเปรียบเทียบ ( ==, !=) ถูกกำหนดสำหรับบูลีนTrueและFalseเพื่อให้ตรงกับ 1 และ 0

นั่นเป็นเหตุผลว่าทำไมในเซตยูเนี่ยนเมื่อตรวจสอบว่าTrueอยู่ในเซตใหม่แล้วจะได้รับคำตอบที่แท้จริง:

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