ปัญหา
คุณต้องระบุรายการที่เกิดขึ้นบ่อยที่สุดตามลำดับ
วิธีแก้ปัญหา
เราสามารถใช้ตัวนับเพื่อติดตามรายการตามลำดับได้
ตัวนับคืออะไร ?
“ตัวนับ” เป็นการแมปที่นับจำนวนเต็มสำหรับแต่ละคีย์ การอัปเดตคีย์ที่มีอยู่จะเพิ่มจำนวนขึ้น ออบเจ็กต์นี้ใช้สำหรับนับอินสแตนซ์ของออบเจ็กต์ที่แฮชได้หรือเป็นมัลติเซ็ต
“เคาน์เตอร์” เป็นหนึ่งในเพื่อนที่ดีที่สุดของคุณเมื่อคุณทำการวิเคราะห์ข้อมูล
วัตถุนี้มีอยู่ใน 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)]