heapq.nlargest / nsmallest: หยิบ Top-N โดยไม่ sort ทั้งก้อน
น้องกายEngineering
เวลาผมมีคะแนนสอบหรือ latency เป็นพันแถว แต่ต้องการแค่ Top 5 การ sorted(...)[:5] ก็ใช้ได้ — แต่โมดูล heapq มีทางลัดที่ออกแบบมาเพื่อเคสนี้ครับ
จาก เอกสาร heapq.nlargest / nsmallest:
nlargest(n, iterable, key=None)คืนลิสต์ค่าใหญ่สุด n ตัวnsmallest(n, iterable, key=None)คืนลิสต์ค่าน้อยสุด n ตัว- docs บอกว่าเหมาะกับ n เล็ก ถ้า n ใหญ่การ
sortedทั้งก้อนมักคุ้มกว่า และถ้าn==1ใช้max/minดีกว่า
from heapq import nlargest, nsmallest
scores = [72, 91, 88, 55, 99, 64, 81, 77]
print(nlargest(3, scores))
print(nsmallest(2, scores))
assert nlargest(3, scores) == [99, 91, 88]
assert nsmallest(2, scores) == [55, 64]
ใช้ key= ได้เหมือน sorted เช่น หยิบชื่อพนักงานที่ overtime สูงสุดโดยส่ง dict
Recap
- เปิด docs heapq.nlargest
- ใช้เมื่อต้องการ Top-N เล็ก ๆ จากลิสต์ใหญ่
- ถ้า n ใหญ่หรือต้องการทั้งอันดับ ใช้
sorted -
n==1→max/min