ปัญหา
คุณต้องระบุรายการที่เกิดขึ้นบ่อยที่สุดตามลำดับ
วิธีแก้ปัญหา
เราสามารถใช้ตัวนับเพื่อติดตามรายการตามลำดับได้
ตัวนับคืออะไร ?
“ตัวนับ” เป็นการแมปที่นับจำนวนเต็มสำหรับแต่ละคีย์ การอัปเดตคีย์ที่มีอยู่จะเพิ่มจำนวนขึ้น ออบเจ็กต์นี้ใช้สำหรับนับอินสแตนซ์ของออบเจ็กต์ที่แฮชได้หรือเป็นมัลติเซ็ต
“เคาน์เตอร์” เป็นหนึ่งในเพื่อนที่ดีที่สุดของคุณเมื่อคุณทำการวิเคราะห์ข้อมูล
วัตถุนี้มีอยู่ใน Python มาระยะหนึ่งแล้ว ดังนั้นสำหรับพวกคุณหลายๆ คน นี่จะเป็นการตรวจสอบอย่างรวดเร็ว เราจะเริ่มด้วยการนำเข้าตัวนับจากคอลเล็กชัน
from collections import Counter
พจนานุกรมแบบดั้งเดิม หากมีคีย์ที่หายไป จะทำให้เกิดข้อผิดพลาดของคีย์ พจนานุกรมของ Python จะตอบด้วยข้อผิดพลาดของคีย์หากไม่พบคีย์
# An empty dictionary dict = {} # check for a key in an empty dict dict['mystring'] # Error message --------------------------------------------------------------------------- KeyError Traceback (most recent call last) <ipython-input-12-1e03564507c6> in <module> 3 4 # check for a key in an empty dict ----> 5 dict['mystring'] 6 7 # Error message KeyError: 'mystring'
เราจะหลีกเลี่ยงข้อยกเว้นข้อผิดพลาดที่สำคัญในสถานการณ์นี้ได้อย่างไร
Counter เป็นคลาสย่อยของพจนานุกรมและมีพฤติกรรมที่คล้ายกับพจนานุกรม อย่างไรก็ตาม หากคุณค้นหาคีย์ที่หายไปแทนที่จะสร้างข้อผิดพลาดของคีย์ มันจะคืนค่าศูนย์
# define the counter c = Counter()
# check for the unavailable key print(f"Output\n{c['mystring']}")
ผลลัพธ์
0
c['mystring'] += 1 print(f"Output\n{c}")
ผลลัพธ์
Counter({'mystring': 1})
ตัวอย่าง
print(f"Output\n{type(c)}")
ผลลัพธ์
<class 'collections.Counter'>
รายการที่เกิดขึ้นบ่อยที่สุดในลำดับ
ข้อดีอีกอย่างหนึ่งเกี่ยวกับเคาน์เตอร์คือคุณสามารถแสดงรายการของวัตถุและจะนับให้คุณ มันช่วยเราจากการวนซ้ำเพื่อสร้างเคาน์เตอร์ของเรา
Counter ('Peas porridge hot peas porridge cold peas porridge in the pot nine days old'.split())
ผลลัพธ์
Counter({'Peas': 1, 'porridge': 3, 'hot': 1, 'peas': 2, 'cold': 1, 'in': 1, 'the': 1, 'pot': 1, 'nine': 1, 'days': 1, 'old': 1})
สิ่งที่ split จะทำคือนำสตริงมาแยกเป็นรายการคำ มันแยกออกเป็นพื้นที่สีขาว
“ตัวนับ” จะวนรอบรายการนั้นและนับคำทั้งหมด ทำให้เรานับที่แสดงในผลลัพธ์
ยังมีอีกมาก ฉันยังนับคำที่พบบ่อยที่สุดในวลีได้อีกด้วย
most_common() method จะให้รายการที่เกิดขึ้นบ่อยแก่เรา
count = Counter('Peas porridge hot peas porridge cold peas porridge in the pot nine days old'.split()) print(f"Output\n{count.most_common(1)}")นับ
ผลลัพธ์
[('porridge', 3)]
ตัวอย่าง
print(f"Output\n{count.most_common(2)}")
ผลลัพธ์
[('porridge', 3), ('peas', 2)]
ตัวอย่าง
print(f"Output\n{count.most_common(3)}")
ผลลัพธ์
[('porridge', 3), ('peas', 2), ('Peas', 1)]
สังเกตว่ามันส่งคืนรายการสิ่งอันดับ ส่วนแรกของทูเพิลคือคำ และส่วนที่สองคือการนับ
คุณลักษณะที่ไม่ค่อยมีใครรู้จักของอินสแตนซ์ Counter คือสามารถรวมเข้าด้วยกันได้อย่างง่ายดายโดยใช้การดำเนินการทางคณิตศาสตร์ต่างๆ
string = 'Peas porridge hot peas porridge cold peas porridge in the pot nine days old' another_string = 'Peas peas hot peas peas peas cold peas' a = Counter(string.split()) b = Counter(another_string.split())
# Add counts add = a + b print(f"Output\n{add}")
ผลลัพธ์
Counter({'peas': 7, 'porridge': 3, 'Peas': 2, 'hot': 2, 'cold': 2, 'in': 1, 'the': 1, 'pot': 1, 'nine': 1, 'days': 1, 'old': 1})
# Subtract counts sub = a - b print(f"Output\n{sub}")
ผลลัพธ์
Counter({'porridge': 3, 'in': 1, 'the': 1, 'pot': 1, 'nine': 1, 'days': 1, 'old': 1})
ในที่สุด Counter ก็ฉลาดมากในการจัดเก็บข้อมูลในคอนเทนเนอร์
ดังที่คุณเห็นด้านบน คำนี้จัดกลุ่มคำต่างๆ ไว้ด้วยกันเมื่อจัดเก็บทำให้เรานำคำเหล่านั้นมารวมกันซึ่งเรียกกันทั่วไปว่าชุดคำหลายชุด
เราสามารถดึงคำทีละคำโดยใช้องค์ประกอบ จำลำดับไม่ได้แต่นำคำทั้งหมดมารวมกันเป็นวลี
ตัวอย่าง
print(f"Output\n{list(a.elements())}")
ผลลัพธ์
['Peas', 'porridge', 'porridge', 'porridge', 'hot', 'peas', 'peas', 'cold', 'in', 'the', 'pot', 'nine', 'days', 'old']
ตัวอย่าง
print(f"Output\n{list(a.values())}")
ผลลัพธ์
[1, 3, 1, 2, 1, 1, 1, 1, 1, 1, 1]
ตัวอย่าง
print(f"Output\n{list(a.items())}")
ผลลัพธ์
[('Peas', 1), ('porridge', 3), ('hot', 1), ('peas', 2), ('cold', 1), ('in', 1), ('the', 1), ('pot', 1), ('nine', 1), ('days', 1), ('old', 1)]