วิธีใช้ตัวนับของ Python จากโมดูลคอลเลกชัน

ในบทช่วยสอนนี้ คุณจะได้เรียนรู้วิธีใช้วัตถุตัวนับจากโมดูลคอลเลกชันของ 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
  • สิ่งนี้จะดำเนินต่อไปจนกว่าเราจะวนซ้ำทั้งสตริง
  วิธีการติดตั้ง Microsoft Mouse and Keyboard Center

เราสร้างพจนานุกรม 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 ในการทำเช่นนั้น เราสามารถใช้เมธอดการลบ () การใช้ .subtract() จะลบค่าที่สอดคล้องกับรายการใน จาก

มาลบ 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’

  วิธีตั้งค่า iCloud บน Mac ของคุณ

ซึ่งจะเป็นประโยชน์อย่างยิ่งหากตัวนับประกอบด้วยรายการจำนวนมาก และคุณสนใจที่จะทำงานกับคีย์ทั่วไป

บทสรุป

นี่คือการทบทวนอย่างรวดเร็วเกี่ยวกับสิ่งที่เราได้เรียนรู้ในบทช่วยสอน:

  • คลาสตัวนับจากโมดูลคอลเลกชันในตัวของ 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 ปกติเพื่อจัดการกับคีย์ที่ขาดหายไป

เรื่องล่าสุด

x