ในบทช่วยสอนนี้ คุณจะได้เรียนรู้วิธีใช้วัตถุตัวนับจากโมดูลคอลเลกชันของ Python
เมื่อคุณทำงานกับลำดับที่ยาวใน Python เช่น รายการหรือสตริงของ Python บางครั้งคุณอาจต้องจัดเก็บรายการที่ปรากฏในลำดับและจำนวนครั้งที่ปรากฏ
พจนานุกรม Python เป็นโครงสร้างข้อมูลในตัวที่เหมาะสมสำหรับแอปพลิเคชันดังกล่าว อย่างไรก็ตาม คลาสตัวนับของ Python จากโมดูลคอลเลกชันสามารถทำให้สิ่งนี้ง่ายขึ้นได้โดยการสร้างตัวนับ ซึ่งเป็นพจนานุกรมของรายการและจำนวนในลำดับ
ในอีกไม่กี่นาทีข้างหน้า คุณจะได้เรียนรู้สิ่งต่อไปนี้:
- ใช้วัตถุตัวนับของ Python
- สร้างพจนานุกรม Python เพื่อเก็บค่านับของรายการในการวนซ้ำ
- เขียนพจนานุกรมใหม่โดยใช้ตัวนับของ Python ด้วยไวยากรณ์ที่เรียบง่าย
- ดำเนินการต่างๆ เช่น การปรับปรุงและการลบองค์ประกอบ การหาจุดตัดระหว่างสองวัตถุตัวนับ
- รับรายการที่พบบ่อยที่สุดในตัวนับโดยใช้เมธอด most_common()
มาเริ่มกันเลย!
Python Collections Module และ Counter Class
คุณมักจะใช้พจนานุกรม Python เพื่อจัดเก็บรายการและนับซ้ำได้ รายการและจำนวนจะถูกจัดเก็บเป็นคีย์และค่าตามลำดับ
เนื่องจากคลาส Counter เป็นส่วนหนึ่งของโมดูลคอลเลกชันในตัวของ Python คุณจึงสามารถนำเข้าคลาสดังกล่าวในสคริปต์ Python ได้ดังนี้:
from collections import Counter
หลังจากนำเข้าคลาส Counter ดังที่กล่าวไว้ คุณสามารถสร้างอินสแตนซ์ของวัตถุตัวนับได้ดังที่แสดง:
<counter_object> = Counter(iterable)
ที่นี่:
- iterable คือ Python ที่ถูกต้องที่สามารถวนซ้ำได้ เช่น Python list, string หรือ tuple
- รายการใน iterable ควรแฮช
ตอนนี้เรารู้วิธีใช้ Counter เพื่อสร้างวัตถุตัวนับจาก Python ที่ทำซ้ำได้ เรามาเริ่มเขียนโค้ดกันเลย
ตัวอย่างที่ใช้ในบทช่วยสอนนี้สามารถพบได้ในส่วนสำคัญของ GitHub
วิธีสร้าง Counter Object จาก Python Iterables
มาสร้างสตริง Python พูดว่า ‘renaissance’ และเรียกมันว่า word
>>> word = "renaissance"
เป้าหมายของเราคือการสร้างพจนานุกรมที่ตัวอักษรแต่ละตัวในสตริงคำจะถูกจับคู่กับจำนวนครั้งที่เกิดขึ้นในสตริง วิธีหนึ่งคือใช้สำหรับลูปที่แสดง:
>>> letter_count = {} >>> for letter in word: ... if letter not in letter_count: ... letter_count[letter] = 0 ... letter_count[letter] += 1 ... >>> letter_count {'r': 1, 'e': 2, 'n': 2, 'a': 2, 'i': 1, 's': 2, 'c': 1}
มาแยกวิเคราะห์ว่าข้อมูลโค้ดด้านบนทำอะไรได้บ้าง:
- เริ่มต้น letter_count เป็นพจนานุกรม Python ที่ว่างเปล่า
- วนซ้ำผ่านสตริงคำ
- ตรวจสอบว่ามีตัวอักษรอยู่ในพจนานุกรม letter_count หรือไม่
- หากไม่มีตัวอักษร ให้เพิ่มด้วยค่า 0 แล้วจึงเพิ่มค่าทีละ 1
- สำหรับการเกิดขึ้นของตัวอักษรในคำแต่ละครั้ง ค่าของ toletter จะเพิ่มขึ้นทีละ 1
- สิ่งนี้จะดำเนินต่อไปจนกว่าเราจะวนซ้ำทั้งสตริง
เราสร้างพจนานุกรม letter_count ขึ้นเอง โดยใช้ for วนซ้ำเพื่อวนผ่านคำสตริง
ตอนนี้ลองใช้คลาส Counter จากโมดูลคอลเลกชัน เราต้องส่งสตริงคำไปที่ Counter() เพื่อรับ letter_count โดยไม่ต้องวนซ้ำ
>>> from collections import Counter >>> letter_count = Counter(word) >>> letter_count Counter({'e': 2, 'n': 2, 'a': 2, 's': 2, 'r': 1, 'i': 1, 'c': 1})
วัตถุตัวนับยังเป็นพจนานุกรม Python เราสามารถใช้ฟังก์ชัน isinstance() ในตัวเพื่อตรวจสอบสิ่งนี้:
>>> isinstance(letter_count,dict) True
ดังที่เห็น isinstance(letter_count, dic) ส่งคืน True เพื่อระบุว่าตัวนับวัตถุ letter_count เป็นอินสแตนซ์ของคลาส Python dict
การปรับเปลี่ยนวัตถุเคาน์เตอร์
จนถึงตอนนี้ เราได้เรียนรู้วิธีสร้างวัตถุตัวนับจากสตริง Python
คุณยังสามารถแก้ไขออบเจกต์ตัวนับได้ด้วยการอัปเดตองค์ประกอบจากรายการอื่นที่ทำซ้ำได้หรือลบรายการอื่นที่ทำซ้ำได้ออกจากรายการเหล่านั้น
การอัปเดตตัวนับด้วยองค์ประกอบจาก Iterable อื่น
มาเริ่มต้นสตริงใหม่กันอีกหนึ่งคำ:
>>> another_word = "effervescence"
สมมติว่าเราต้องการอัปเดตวัตถุตัวนับ letter_count ด้วยรายการจากสตริง another_word
เราสามารถใช้เมธอด update() บนตัวนับ letter_count
>>> letter_count.update(another_word) >>> letter_count Counter({'e': 7, 'n': 3, 's': 3, 'c': 3, 'r': 2, 'a': 2, 'f': 2, 'i': 1, 'v': 1})
ในผลลัพธ์ เราเห็นว่าวัตถุตัวนับได้รับการปรับปรุงให้รวมตัวอักษรและจำนวนครั้งที่เกิดขึ้นจาก another_word ด้วย
การลบองค์ประกอบจาก Iterable อื่น
ทีนี้มาลบค่าของ another_word ออกจากวัตถุ letter_count ในการทำเช่นนั้น เราสามารถใช้เมธอดการลบ () การใช้
มาลบ another_word จาก letter_count กัน
>>> letter_count.subtract(another_word) >>> letter_count Counter({'e': 2, 'n': 2, 'a': 2, 's': 2, 'r': 1, 'i': 1, 'c': 1, 'f': 0, 'v': 0})
เราพบว่าค่าที่ตรงกับตัวอักษรใน another_word ถูกลบออกแล้ว แต่คีย์ ‘f’ และ ‘v’ ที่เพิ่มเข้ามาจะไม่ถูกลบออก ตอนนี้พวกเขาจับคู่กับค่า 0
หมายเหตุ: ที่นี่ เราได้ส่งผ่านใน another_word ซึ่งเป็นสตริง Python ไปยังการลบ () วิธีการเรียก นอกจากนี้เรายังสามารถส่ง Python counter object หรือตัวอื่นที่ทำซ้ำได้
การแยกระหว่างวัตถุตัวนับสองตัวใน Python
บางครั้งคุณอาจต้องการหาจุดตัดระหว่างวัตถุตัวนับ Python สองตัวเพื่อระบุว่าคีย์ใดเหมือนกันระหว่างทั้งสอง
มาสร้างวัตถุตัวนับกัน เช่น letter_count_2 จากสตริง another_word ‘effervescence’
>>> another_word = "effervescence" >>> letter_count_2 = Counter(another_word) >>> letter_count_2 Counter({'e': 5, 'f': 2, 'c': 2, 'r': 1, 'v': 1, 's': 1, 'n': 1})
เราสามารถใช้ตัวดำเนินการอย่างง่าย & เพื่อหาจุดตัดระหว่าง letter_count และ letter_count_2
>>> letter_count & letter_count_2 Counter({'e': 2, 'r': 1, 'n': 1, 's': 1, 'c': 1})
สังเกตว่าคุณได้รับคีย์และจำนวนครั้งที่เกิดขึ้นกับคำสองคำอย่างไร ทั้ง ‘renaissance’ และ ‘effervescence’ มี ‘e’ เกิดขึ้นสองครั้ง และ ‘r’, ‘n’, ‘s’ และ ‘c’ เหมือนกันอย่างละ 1 ครั้ง
ค้นหารายการที่พบบ่อยที่สุดโดยใช้ most_common
การดำเนินการทั่วไปอื่นบนวัตถุตัวนับ Python คือการค้นหารายการที่เกิดขึ้นบ่อยที่สุด
ในการรับรายการที่พบบ่อยที่สุด k อันดับแรกในตัวนับ คุณสามารถใช้เมธอด most_common() กับวัตถุตัวนับ ที่นี่ เราเรียก most_common() ใน letter_count เพื่อค้นหาตัวอักษรสามตัวที่เกิดขึ้นบ่อยที่สุด
>>> letter_count.most_common(3) [('e', 2), ('n', 2), ('a', 2)]
เราเห็นว่าตัวอักษร ‘e’, ’n’ และ ‘a’ ปรากฏขึ้นสองครั้งในคำว่า ‘renaissance’
ซึ่งจะเป็นประโยชน์อย่างยิ่งหากตัวนับประกอบด้วยรายการจำนวนมาก และคุณสนใจที่จะทำงานกับคีย์ทั่วไป
บทสรุป
นี่คือการทบทวนอย่างรวดเร็วเกี่ยวกับสิ่งที่เราได้เรียนรู้ในบทช่วยสอน:
- คลาสตัวนับจากโมดูลคอลเลกชันในตัวของ Python สามารถใช้เพื่อรับพจนานุกรมของค่านับของรายการทั้งหมดในการวนซ้ำใดๆ คุณควรตรวจสอบให้แน่ใจว่ารายการทั้งหมดใน iterable สามารถแฮชได้
- คุณสามารถอัปเดตเนื้อหาของออบเจ็กต์ตัวนับ Python หนึ่งรายการด้วยเนื้อหาจากออบเจ็กต์ตัวนับอื่นหรือทำซ้ำได้โดยใช้เมธอด update() ด้วยไวยากรณ์: counter1.update(counter2) โปรดทราบว่าคุณสามารถใช้ iterable ใดๆ แทน counter2 ได้
- หากคุณต้องการลบเนื้อหาของหนึ่งใน iterables ออกจากตัวนับที่อัปเดต คุณสามารถใช้เมธอดการลบ (): counter1.subtract(counter2)
- หากต้องการค้นหาองค์ประกอบทั่วไประหว่างวัตถุตัวนับสองชิ้น คุณสามารถใช้ตัวดำเนินการ & ให้สองเคาน์เตอร์ counter1 และ counter2, counter1 & counter2 ส่งกลับจุดตัดของสองวัตถุเคาน์เตอร์
- ในการรับ k รายการที่พบบ่อยที่สุดในตัวนับ คุณสามารถใช้เมธอด most_common() counter.most_common(k) ให้ k รายการที่พบมากที่สุดและนับตามลำดับ
จากนั้น เรียนรู้วิธีใช้ dict เริ่มต้น ซึ่งเป็นคลาสอื่นในโมดูลคอลเลกชัน คุณสามารถใช้ dict เริ่มต้นแทนพจนานุกรม Python ปกติเพื่อจัดการกับคีย์ที่ขาดหายไป