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

จะระบุรายการที่เกิดขึ้นบ่อยที่สุดในลำดับด้วย Python ได้อย่างไร


ปัญหา

คุณต้องระบุรายการที่เกิดขึ้นบ่อยที่สุดตามลำดับ

วิธีแก้ปัญหา

เราสามารถใช้ตัวนับเพื่อติดตามรายการตามลำดับได้

ตัวนับคืออะไร ?

“ตัวนับ” เป็นการแมปที่นับจำนวนเต็มสำหรับแต่ละคีย์ การอัปเดตคีย์ที่มีอยู่จะเพิ่มจำนวนขึ้น ออบเจ็กต์นี้ใช้สำหรับนับอินสแตนซ์ของออบเจ็กต์ที่แฮชได้หรือเป็นมัลติเซ็ต

“เคาน์เตอร์” เป็นหนึ่งในเพื่อนที่ดีที่สุดของคุณเมื่อคุณทำการวิเคราะห์ข้อมูล

วัตถุนี้มีอยู่ใน 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)]