Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

วิธหารายการที่เกิดบ่อยที่สุดใน Sequence ด้วย Python Counter

ปัญหา

ต้องการระบุรายการที่เกิดบ่อยที่สุดในลำดับข้อมูล (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 เป็นเครื่องมือทรงพลังสำหรับการนับความถี่ การหาค่าที่พบบ่อยที่สุด และการคำนวณทางคณิตศาสตร์บนข้อมูลนับ