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 เมื่อมีค่าซ้ำ
- วัดขนาดข้อมูล — ถ้าร้อนเกิน ย้ายไปโครงสร้างที่เหมาะกว่า