ปัญหา
ต้องการระบุรายการที่เกิดบ่อยที่สุดในลำดับข้อมูล (Sequence)
วิธีแก้: ใช้ Counter จาก collections
Counter คืออะไร?
Counter เป็น subclass ของ dictionary ที่เก็บจำนวนนับ (integer count) สำหรับแต่ละ key เหมาะสำหรับนับ hashable objects หรือเป็น multiset
from collections import Counter
ความแตกต่างจาก Dictionary ธรรมดา
Dict ธรรมดา: key ไม่มี → raise KeyError
Counter: key ไม่มี → คืนค่า 0 (ไม่ error)
c = Counter()
c['mystring'] # 0 (ไม่ error)
c['mystring'] += 1
print(c) # Counter({'mystring': 1})
นับคำในข้อความ
text = 'Peas porridge hot peas porridge cold peas porridge in the pot nine days old'
count = Counter(text.split())
print(count)
# Counter({'porridge': 3, 'peas': 2, 'Peas': 1, 'hot': 1, 'cold': 1, 'in': 1, 'the': 1, 'pot': 1, 'nine': 1, 'days': 1, 'old': 1})
หาคำที่พบบ่อยที่สุด: .most_common(n)
count.most_common(1) # [('porridge', 3)]
count.most_common(2) # [('porridge', 3), ('peas', 2)]
count.most_common(3) # [('porridge', 3), ('peas', 2), ('Peas', 1)]
คืนค่าเป็น list of tuples: (item, count)
การรวม Counter (Mathematical Operations)
a = Counter('Peas porridge hot peas porridge cold peas porridge in the pot nine days old'.split())
b = Counter('Peas peas hot peas peas peas cold peas'.split())
# บวกจำนวน
a + b
# Counter({'peas': 7, 'porridge': 3, 'Peas': 2, 'hot': 2, 'cold': 2, ...})
# ลบจำนวน (ค่าติดลบจะถูกตัดทิ้ง)
a - b
# Counter({'porridge': 3, 'in': 1, 'the': 1, 'pot': 1, 'nine': 1, 'days': 1, 'old': 1})
เมธอดเพิ่มเติม
.elements()- ดึง elements ทั้งหมด (ซ้ำตามจำนวนนับ).values()- ดึงค่าจำนวนนับทั้งหมด.items()- ดึง (key, count) pairs
list(a.elements()) # ['Peas', 'porridge', 'porridge', 'porridge', 'hot', 'peas', 'peas', 'cold', 'in', 'the', 'pot', 'nine', 'days', 'old']
สรุป
Counter เป็นเครื่องมือทรงพลังสำหรับการนับความถี่ การหาค่าที่พบบ่อยที่สุด และการคำนวณทางคณิตศาสตร์บนข้อมูลนับ