ในบทช่วยสอนนี้ คุณจะได้เรียนรู้วิธีใช้ defaultdict จากโมดูลคอลเลกชันของ Python เพื่อจัดการกับ KeyErrors ได้ดีขึ้น เมื่อทำงานกับพจนานุกรม Python
ใน Python พจนานุกรมคือโครงสร้างข้อมูลในตัวที่มีประสิทธิภาพซึ่งจัดเก็บข้อมูลในคู่คีย์-ค่า คุณจะใช้ปุ่มต่างๆ เพื่อแตะลงในพจนานุกรมและเข้าถึงค่าต่างๆ
อย่างไรก็ตาม เมื่อคุณมีพจนานุกรมหลายพจนานุกรมในสคริปต์ Python ของคุณซึ่งถูกแก้ไขในระหว่างการเรียกใช้โค้ด คุณมักจะพบ KeyErrors และมีหลายวิธีที่คุณสามารถจัดการกับมันได้
ในบทช่วยสอนนี้ คุณจะได้เรียนรู้:
- KeyErrors คืออะไรและเหตุใดจึงเกิดขึ้น
- วิธีจัดการกับ KeyErrors
- วิธีใช้ defaultdict ของ Python ซึ่งเป็นคลาสย่อยที่สืบทอดจากคลาส dict ในตัว เพื่อจัดการกับคีย์ที่หายไปได้ดียิ่งขึ้น
เอาล่ะ!
KeyErrors ใน Python คืออะไร?
เมื่อกำหนดพจนานุกรม Python คุณควรดูแลให้มั่นใจว่าสิ่งต่อไปนี้:
- คีย์ควรไม่ซ้ำกัน – ไม่มีการทำซ้ำ
- เมื่อใช้ iterable ที่มีอยู่เป็นคีย์ของพจนานุกรม คุณควรเลือกใช้คอลเลกชันที่ไม่เปลี่ยนรูป เช่น tuple
ดังนั้นรหัสจะใช้ได้ก็ต่อเมื่อมีอยู่ในพจนานุกรมเท่านั้น มิฉะนั้นจะนำไปสู่ KeyErrors
พิจารณาพจนานุกรม books_authors ต่อไปนี้ ซึ่งคีย์คือชื่อหนังสือและค่าคือชื่อผู้แต่ง
คุณสามารถเขียนโค้ดพร้อมกับบทช่วยสอนนี้ใน Python REPL
books_authors = { 'Deep Work':'Cal Newport', 'Hyperfocus':'Chris Bailey', 'Pivot':'Jenny Blake', 'The Happiness Equation':'Neil Pasricha' }
คุณสามารถใช้กุญแจ (ชื่อหนังสือ) เพื่อเข้าถึงชื่อผู้แต่ง
books_authors['Hyperfocus'] 'Chris Bailey'
ในการเข้าถึงคู่คีย์-ค่าทั้งหมดในพจนานุกรม คุณสามารถเรียกเมธอด items() บนอ็อบเจ็กต์พจนานุกรม ดังที่แสดงด้านล่าง:
for book,author in books_authors.items(): print(f"'{book}' by {author}")
'Deep Work' by Cal Newport 'Hyperfocus' by Chris Bailey 'Pivot' by Jenny Blake 'The Happiness Equation' by Neil Pasricha
หากคุณพยายามเข้าถึงค่าของคีย์ที่ไม่มีอยู่ในพจนานุกรม ล่าม Python จะสร้าง KeyError เราพบ KeyError เมื่อเราพยายามเข้าถึงค่าของคีย์ที่ไม่มีอยู่จริง นั่นคือ ‘Grit’ และ ‘คีย์ที่ไม่มีอยู่จริง’
books_authors['Grit']
--------------------------------------------------------------------------- KeyError Traceback (most recent call last) <ipython-input-6-e1a4486f5ced> in <module> ----> 1 books_authors['Grit'] KeyError: 'Grit'
books_authors['non-existent-key']
--------------------------------------------------------------------------- KeyError Traceback (most recent call last) <ipython-input-7-a3efd56f69e5> in <module> ----> 1 books_authors['non-existent-key'] KeyError: 'non-existent-key'
คุณจะจัดการกับ KeyErrors ใน Python ได้อย่างไร?
มีหลายวิธีที่จะทำ และเราจะเรียนรู้ในหัวข้อถัดไป
วิธีจัดการกับ KeyErrors ใน Python
มาเรียนรู้วิธีจัดการกับ KeyErrors โดยใช้:
- ประโยคเงื่อนไขแบบ if-else
- ลองยกเว้นบล็อก
- วิธีพจนานุกรม .get()
#1. การใช้คำสั่งเงื่อนไขแบบ if-Else
วิธีที่ง่ายที่สุดวิธีหนึ่งในการจัดการ KeyErrors ใน Python คือการใช้คำสั่งแบบมีเงื่อนไขแบบ if-else
ใน Python คำสั่ง if-else มีไวยากรณ์ทั่วไปดังต่อไปนี้:
if condition: # do this else: # do something else
- ถ้าเงื่อนไขเป็นจริง คำสั่งใน if body จะถูกดำเนินการ และ
- หากเงื่อนไขเป็นเท็จ คำสั่งในส่วนอื่นจะถูกดำเนินการ
ในตัวอย่างนี้ เงื่อนไขคือตรวจสอบว่ามีคีย์อยู่ในพจนานุกรมหรือไม่
หากมีคีย์อยู่ในพจนานุกรม ตัวดำเนินการ in จะคืนค่าเป็น True และหากเนื้อหาถูกเรียกใช้งานจะพิมพ์ค่าที่เกี่ยวข้อง
key = 'The Happiness Equation' if key in books_authors: print(books_authors[key]) else: print('Sorry, this key does not exist!') # Output # Neil Pasricha
หากไม่มีคีย์ในพจนานุกรม ตัวดำเนินการ in จะส่งกลับค่า False และส่วน else จะถูกดำเนินการ มันพิมพ์ข้อความว่าไม่มีคีย์
key = 'non-existent-key' if key in books_authors: print(books_authors[key]) else: print('Sorry, this key does not exist!') # Output # Sorry, this key does not exist!
#2. การใช้คำสั่ง Try-Exception
อีกวิธีหนึ่งที่ใช้กันทั่วไปในการจัดการ KeyError คือการใช้คำสั่ง try-except ใน Python
อ่านบล็อกรหัสต่อไปนี้:
key = 'non-existent-key' try: print(books_authors[key]) except KeyError: print('Sorry, this key does not exist!')
- บล็อกการลองพยายามดึงค่าที่สอดคล้องกับคีย์ที่ให้มา
- หากไม่มีคีย์ ล่ามจะสร้าง KeyError ซึ่งได้รับการจัดการเป็นข้อยกเว้นภายในบล็อกการยกเว้น
#3. ใช้ .get() วิธีการ
ใน Python คุณสามารถใช้เมธอดพจนานุกรมในตัว .get() เพื่อจัดการกับคีย์ที่หายไป
ไวยากรณ์ทั่วไปที่จะใช้เมธอด get() คือ dict.get(key,default_value) โดยที่ dict เป็นอ็อบเจ็กต์พจนานุกรมที่ถูกต้องใน Python
– หากมีคีย์อยู่ในพจนานุกรม เมธอด get() จะคืนค่ากลับมา
– มิฉะนั้นจะส่งกลับค่าเริ่มต้น
ในตัวอย่างนี้ คีย์คือรายการคีย์ที่มีค่าที่เราต้องการเข้าถึง เราวนซ้ำรายการคีย์เพื่อดึงค่าที่เกี่ยวข้องจากพจนานุกรม books_authors
ที่นี่ เราได้ใช้เมธอด .get() โดยมี ‘ไม่มีอยู่’ เป็นค่าเริ่มต้น
keys = ['Grit','Hyperfocus','Make Time','Deep Work'] for key in keys: print(books_authors.get(key,'Does not exist'))
ในรหัสด้านบน:
- สำหรับคีย์ที่มีอยู่ในพจนานุกรม books_authors เมธอด .get() จะคืนค่าที่เกี่ยวข้อง
- เมื่อไม่มีคีย์ ในกรณีนี้คือ ‘Grit’ และ ‘Make Time’ เมธอด .get() จะส่งกลับค่าเริ่มต้น ‘ไม่มีอยู่’
# Output Does not exist Chris Bailey Does not exist Cal Newport
วิธีการทั้งหมดข้างต้นช่วยเราในการจัดการข้อผิดพลาดที่สำคัญ อย่างไรก็ตาม มีความละเอียดถี่ถ้วนและต้องการให้เราจัดการกับคีย์ที่หายไปอย่างชัดเจน คุณสามารถทำให้กระบวนการนี้ง่ายขึ้นโดยใช้ defaultdict แทนพจนานุกรมทั่วไป
Defaultdict ใน Python
defaultdict เป็นคลาสย่อยของคลาสพจนานุกรม (dict) ดังนั้นมันจึงสืบทอดพฤติกรรมของพจนานุกรม Python นอกจากนี้ ยังจัดการคีย์ที่หายไปโดยกำเนิด
defaultdict เป็นชนิดข้อมูลคอนเทนเนอร์ที่สร้างขึ้นในไลบรารีมาตรฐาน Python – ภายในโมดูลคอลเลกชัน
ดังนั้นคุณต้องนำเข้าไปยังสภาพแวดล้อมการทำงานของคุณ:
from collections import defaultdict
นี่คือไวยากรณ์ทั่วไปที่จะใช้ defaultdict:
defaultdict(default_factory)
คุณสามารถระบุ callable เช่น int, float หรือ list เป็นแอตทริบิวต์ default_factory หากคุณไม่ได้ระบุค่าสำหรับ default_factory ค่าดีฟอลต์คือไม่มี
เมื่อคีย์ที่คุณกำลังค้นหาไม่มีอยู่ เมธอด __missing__() จะถูกทริกเกอร์ และจะอนุมานค่าเริ่มต้นจาก default_factory จากนั้นจะส่งกลับค่าเริ่มต้นนี้
สรุป:
- ใน Python defaultdict จะคืนค่าดีฟอลต์เมื่อไม่มีคีย์
- นอกจากนี้ยังเพิ่มคู่ค่าดีฟอลต์ของคีย์นี้ลงในพจนานุกรม ซึ่งคุณสามารถแก้ไขได้
Python Defaultdict ตัวอย่าง
ต่อไป เราจะโค้ดตัวอย่างบางส่วนเพื่อทำความเข้าใจว่า Python defaultdict ทำงานอย่างไร
Defaultdict ใน Python พร้อมค่าจำนวนเต็มเริ่มต้น
ขั้นแรก นำเข้า defaultdict จากโมดูลคอลเลกชัน
from collections import defaultdict import random
ให้เราสร้างราคาผิดนัด
prices = defaultdict(int)
ตอนนี้เราเติมพจนานุกรมราคาโดยใช้รายการผลไม้เป็นคีย์ และเราสุ่มตัวอย่างค่าจาก price_list เพื่อรับค่า
price_list = [10,23,12,19,5] fruits = ['apple','strawberry','pomegranate','blueberry'] for fruit in fruits: prices[fruit] = random.choice(price_list)
มาดูคู่คีย์-ค่าในค่าผิดนัดของราคากัน
print(prices.items())
dict_items([('apple', 12), ('blueberry', 19), ('pomegranate', 5), ('strawberry', 10)])
เช่นเดียวกับพจนานุกรม Python ทั่วไป คุณสามารถเข้าถึงค่าของราคา defaultdict โดยใช้คีย์:
prices['apple'] # 23
ทีนี้ลองมาดูราคาผลไม้ที่ไม่มีขายกัน ว่า ‘ส้ม’ กัน เราเห็นว่าจะส่งกลับค่าเริ่มต้นเป็นศูนย์
prices['orange'] # 0
หากเราพิมพ์พจนานุกรมออกมา เราจะเห็นว่าคีย์ใหม่ ‘สีส้ม’ ถูกเพิ่มด้วยค่าจำนวนเต็มเริ่มต้นเป็นศูนย์
print(prices.items())
dict_items([('apple', 12), ('blueberry', 19), ('pomegranate', 5), ('strawberry', 10), ('orange', 0)])
Defaultdict ใน Python พร้อมรายการเป็นค่าเริ่มต้น
มากำหนดนักเรียน_majors เป็น defaultdict ของรายการ ชื่อของวิชาเอกคือกุญแจ และค่านิยมคือรายชื่อของนักศึกษาที่เรียนวิชาเอกแต่ละวิชา เช่น คณิตศาสตร์ เศรษฐศาสตร์ วิทยาการคอมพิวเตอร์ และอื่นๆ
from collections import defaultdict students_majors = defaultdict(list)
หากเราพยายามเข้าถึงรายชื่อนักเรียนที่สอดคล้องกับ ‘เศรษฐศาสตร์’ defaultdict จะส่งกลับรายการว่าง ไม่มีข้อผิดพลาดที่สำคัญ!
students_majors['Economics'] # []
ตอนนี้เรามีรายการว่างที่แมปกับสาขาวิชา ‘เศรษฐศาสตร์’ ดังนั้นเราจึงสามารถเพิ่มองค์ประกอบในรายการนี้โดยใช้เมธอด list .append()
students_majors['Economics'].append('Alex')
มีการสร้างรายการสำหรับ ‘เศรษฐศาสตร์’ ในพจนานุกรมเริ่มต้นของนักเรียน_majors
print(students_majors)
defaultdict(<class 'list'>, {'Economics': ['Alex']})
คุณสามารถเพิ่มนักเรียนในรายการที่แมปไปยังวิชาเอกเศรษฐศาสตร์ เพิ่มวิชาเอกใหม่ และอีกมากมาย!
students_majors['Economics'].append('Bob') students_majors['Math'].append('Laura') print(students_majors)
defaultdict(<class 'list'>, {'Economics': ['Alex', 'Bob'], 'Math': ['Laura']})
บทสรุป
ฉันหวังว่าบทช่วยสอนนี้จะช่วยให้คุณเข้าใจว่าคุณควรใช้ defaultdict ใน Python อย่างไรและเมื่อใด หลังจากรันตัวอย่างโค้ดในบทช่วยสอนนี้แล้ว คุณสามารถลองใช้ defaultdict เป็นโครงสร้างข้อมูลที่ต้องการในโครงการของคุณเมื่อจำเป็น
นี่คือบทสรุปของสิ่งที่คุณได้เรียนรู้ในบทช่วยสอนนี้
- เมื่อทำงานกับพจนานุกรม Python คุณมักจะพบ KeyErrors
- ในการจัดการ KeyErrors ดังกล่าว คุณสามารถใช้วิธีการแบบละเอียดสองสามวิธี คุณสามารถใช้คำสั่งแบบมีเงื่อนไข บล็อกการลองยกเว้น หรือเมธอด .get() แต่ชนิดข้อมูล defaultdict ในโมดูลคอลเลกชันสามารถทำให้การจัดการ KeyError นี้ง่ายขึ้น
- คุณสามารถใช้ defaultdict(default_factory) โดยที่ default_factory เป็น callable ที่ถูกต้อง
- เมื่อไม่มีคีย์ใน defaultdict ค่าเริ่มต้น (อนุมานจาก default_factory) และคีย์จะถูกเพิ่มไปยัง defaultdict
ถัดไป ดูบทช่วยสอนเกี่ยวกับฟังก์ชันแผนที่ Python