แถวการ์ดเรียงแล้วมีการ์ดใหม่สอดกลางอย่างเป็นระเบียบ

Python bisect.insort: สอดค่าใหม่แล้วยังเรียงอยู่

น้องกายEngineering

ต้องแทรกคะแนนใหม่แล้วยังให้ลิสต์เรียงอยู่ใช่ไหมครับ — ใช้ bisect.insort จาก stdlib

หัวใจ:

  • หาตำแหน่งด้วย binary search แล้ว list.insert ให้
  • คงลำดับ ascending (มี insort_left / insort_right ถ้าต้องการคุมฝั่งซ้ำ)
  • ดีกับลิสต์ไม่ใหญ่ — ถ้าแทรกถี่มากอาจดูโครงสร้างอื่น
import bisect
import unittest

class TestInsort(unittest.TestCase):
    def test_keeps_sorted(self):
        xs = [1, 3, 5, 7]
        bisect.insort(xs, 4)
        self.assertEqual(xs, [1, 3, 4, 5, 7])

    def test_duplicate_right(self):
        xs = [1, 2, 2, 3]
        bisect.insort_right(xs, 2)
        self.assertEqual(xs, [1, 2, 2, 2, 3])

if __name__ == "__main__":
    unittest.main()

Recap

  • ใช้ insort เมื่อลิสต์ต้องเรียงตลอดหลังแทรก
  • เลือกระหว่าง left/right เมื่อมีค่าซ้ำ
  • วัดขนาดข้อมูล — ถ้าร้อนเกิน ย้ายไปโครงสร้างที่เหมาะกว่า