ลำดับกำหนดเองด้วย 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- sorted() และฟังก์ชัน key
- เรียงตามหลายฟิลด์
- ลำดับกำหนดเองด้วย functools.cmp_to_key
- เหตุใดการเรียงก่อนจึงปลดล็อกวิธีแก้