Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

Python: หาตัวเลขที่ไม่ซ้ำและไม่เหมือนกันระหว่างสองจำนวน (Symmetric Difference)

บทนำ

โจทย์: หาตัวเลข (digit) ที่ปรากฏในจำนวนหนึ่งแต่ไม่ปรากฏในอีกจำนวนหนึ่ง (symmetric difference) โดยแสดงผลเรียงจากมากไปน้อย

หลักการ: ใช้ Set Symmetric Difference

set1.symmetric_difference(set2) หรือ set1 ^ set2 คืนสมาชิกที่อยู่ในเซตใดเซตหนึ่งเพียงอย่างเดียว

ตัวอย่างโค้ด


def distinct_uncommon_digits(num1, num2):
    """คืนลิสต์ตัวเลขที่ไม่ซ้ำระหว่างสองจำนวน เรียงมากไปน้อย"""
    # แปลงเป็นสตริง แล้วแยกตัวเลขแต่ละหลักเป็นเซต
    set1 = set(str(num1))
    set2 = set(str(num2))
    
    # Symmetric difference: อยู่ในฝั่งเดียวเท่านั้น
    uncommon = set1 ^ set2
    
    # แปลงเป็น int, เรียงมากไปน้อย
    result = sorted([int(d) for d in uncommon], reverse=True)
    return result

# ทดสอบ
num_1 = 567234
num_2 = 87953573214

print(f"จำนวนที่ 1: {num_1}")
print(f"จำนวนที่ 2: {num_2}")

result = distinct_uncommon_digits(num_1, num_2)
print("ตัวเลขที่ไม่ซ้ำ (มาก → น้อย):", result)

ผลลัพธ์

จำนวนที่ 1: 567234
จำนวนที่ 2: 87953573214
ตัวเลขที่ไม่ซ้ำ (มาก → น้อย): [9, 8, 6, 1]

การทำงานทีละขั้นตอน


num_1 = 567234  → set('567234')  → {'5','6','7','2','3','4'}
num_2 = 87953573214 → set('87953573214') → {'8','7','9','5','3','2','1','4'}

Intersection (ร่วมกัน): {'5','7','3','2','4'}
set1 ^ set2 = {'6', '1', '8', '9'}  ← เฉพาะฝั่งเดียว
sorted(..., reverse=True) → [9, 8, 6, 1]

เวอร์ชันย่อ (One-liner)


uncommon = sorted({int(d) for d in set(str(num1)) ^ set(str(num2))}, reverse=True)

กรณีใช้งานจริง

  • เปรียบเทียบรหัส PIN, เบอร์โทร, หมายเลขบัตร
  • ตรวจสอบความแตกต่างของรหัสสินค้า
  • เกมตัวเลข / ปริศนาคณิตศาสตร์

ข้อควรระวัง

  • แปลงเป็น str ก่อน เพื่อแยก digit ได้ถูกต้อง (จำนวนเต็มไม่สามารถ iterate ตัวเลขได้โดยตรง)
  • เลข 0 นำหน้าจะหายไปใน int (แต่ไม่มีผลกับ digit extraction)
  • ตัวเลขลบ: ต้องลบเครื่องหมาย '-' ก่อน หรือจัดการแยก

สรุป

ใช้ set(str(num1)) ^ set(str(num2)) หา symmetric difference ของ digit ได้อย่างกระชับและมีประสิทธิภาพ แล้วแปลงเป็น int และ sort ตามต้องการ