0Pricing
Competitive Programming Academy · บทเรียน

ลำดับกำหนดเองด้วย functools.cmp_to_key

เขียนตัวเปรียบเทียบเมื่อคีย์ไม่เพียงพอ

ลำดับกำหนดเองด้วย functools.cmp_to_key เป็นบทเรียน Competitive Programming Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Competitive Programming Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Competitive Programming Academy มีบทเรียนทั้งหมด 4 บทเรียน

เมื่อ key ไม่สามารถแสดงลำดับที่ต้องการได้

ลำดับบางแบบขึ้นอยู่กับการเปรียบเทียบสมาชิกสองตัวร่วมกัน ไม่ใช่การดูค่าแยกกัน สำหรับกรณีเหล่านี้ ให้เขียนฟังก์ชันเปรียบเทียบแทนการใช้ key

ฟังก์ชันเปรียบเทียบคืนค่าอะไร

ฟังก์ชันเปรียบเทียบรับสมาชิกสองตัวคือ a และ b ให้คืนค่าตัวเลขลบเมื่อ a ควรมาก่อน คืนค่าบวกเมื่อ b ควรมาก่อน และคืนค่าศูนย์เมื่อทั้งคู่เท่ากัน

def cmp(a, b):
    if a < b: return -1
    if a > b: return 1
    return 0

เชื่อมต่อด้วย cmp_to_key

การเรียงลำดับของ Python รับเฉพาะ key ดังนั้นให้ห่อฟังก์ชันเปรียบเทียบด้วย functools.cmp_to_key เพื่อเปลี่ยนให้เป็น key ที่ใช้งานได้

from functools import cmp_to_key
items.sort(key=cmp_to_key(cmp))

โจทย์เรียงตัวเลขให้ได้จำนวนที่ใหญ่ที่สุดแบบคลาสสิก

หากต้องการนำตัวเลขมาต่อกันเป็นสตริงที่ใหญ่ที่สุด ให้เปรียบเทียบคู่ตัวเลขโดยดูว่าการต่อข้อความแบบใดมีค่ามากกว่า key ธรรมดาไม่สามารถแสดงเงื่อนไขนี้ได้

def cmp(a, b):
    return (a + b < b + a) - (a + b > b + a)

อ่านเคล็ดลับการเปรียบเทียบ

นิพจน์จะคืนค่า -1 เมื่อ a+b ให้การต่อข้อความที่ใหญ่กว่า ดังนั้น a จึงถูกเรียงไว้ก่อน b วิธีนี้จะสร้างจำนวนที่ใหญ่ที่สุดเท่าที่เป็นไปได้

nums = ["3", "30", "34"]
nums.sort(key=cmp_to_key(cmp))
print("".join(nums))   # 34330

สิ่งสำคัญคือเครื่องหมาย

การเรียงลำดับจะดูเฉพาะเครื่องหมายของผลลัพธ์ การคืนค่า -2 หรือ -100 ให้ผลเหมือน -1 ดังนั้นไม่ต้องกังวลกับขนาดที่แน่นอน

รักษาความสอดคล้องของฟังก์ชันเปรียบเทียบ

ฟังก์ชันเปรียบเทียบต้องสอดคล้องกัน: หาก a ชนะ b และ b ชนะ c แล้ว a ต้องชนะ c ด้วย ความขัดแย้งจะทำให้ลำดับผลลัพธ์ผิดเพี้ยน

เลือกใช้ key เมื่อทำได้

key จะถูกคำนวณเพียงครั้งเดียวต่อสมาชิก แต่ฟังก์ชันเปรียบเทียบจะทำงานกับหลายคู่และช้ากว่า ให้ใช้ cmp_to_key เฉพาะเมื่อ key ไม่สามารถแก้โจทย์ได้จริง ๆ

ทางลัดด้วยการลบ

สำหรับการเปรียบเทียบตัวเลข คุณสามารถคืนค่า a - b ได้โดยตรง เพราะเครื่องหมายของผลลัพธ์เข้ารหัสลำดับไว้แล้ว วิธีนี้สั้นและปลอดภัยสำหรับจำนวนเต็ม

items.sort(key=cmp_to_key(lambda a, b: a - b))

ระวังจำนวนทศนิยม

สำหรับจำนวนทศนิยม a - b อาจถูกปัดเศษจนมีค่าเล็กมากหรือเป็นศูนย์ ให้เปรียบเทียบด้วยเงื่อนไขแยกอย่างชัดเจนเพื่อหลีกเลี่ยงการตัดสินว่าค่าเท่ากันผิดพลาด

ฟังก์ชันเปรียบเทียบเปิดทางสู่ลำดับแบบกำหนดเอง

ลำดับการต่อข้อความ การจัดอันดับแบบกำหนดเอง และการตัดสินค่าที่เท่ากันตามกฎ ล้วนทำได้ ฟังก์ชันเปรียบเทียบคือทางออกสำหรับการเรียงลำดับที่ซับซ้อน

ตรวจสอบอย่างรวดเร็ว

ฟังก์ชันเปรียบเทียบของคุณคืนค่าตัวเลขลบสำหรับ cmp(a, b)

สรุป

คุณสามารถห่อฟังก์ชันเปรียบเทียบด้วย cmp_to_key เพื่อจัดลำดับที่ key ไม่สามารถแสดงได้ ให้คืนค่าเป็นเครื่องหมาย รักษาความสอดคล้อง และเลือกใช้ key เมื่อทำได้ 🧩

คำถามที่พบบ่อย

บทเรียน “ลำดับกำหนดเองด้วย functools.cmp_to_key” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “ลำดับกำหนดเองด้วย functools.cmp_to_key” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Competitive Programming Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Competitive Programming Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “ลำดับกำหนดเองด้วย functools.cmp_to_key”

เขียนตัวเปรียบเทียบเมื่อคีย์ไม่เพียงพอ คุณปฏิบัติ Competitive Programming Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Competitive Programming Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Competitive Programming Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน

บทเรียน “ลำดับกำหนดเองด้วย functools.cmp_to_key” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Competitive Programming Academy นี้ได้ไหม

ได้ บทเรียน Competitive Programming Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. sorted() และฟังก์ชัน key
  2. เรียงตามหลายฟิลด์
  3. ลำดับกำหนดเองด้วย functools.cmp_to_key
  4. เหตุใดการเรียงก่อนจึงปลดล็อกวิธีแก้
← กลับไปที่ Competitive Programming Academy