คุณควรใช้ Defaultdict ใน Python อย่างไรและเมื่อใด
เผยแพร่แล้ว: 2022-10-06ในบทช่วยสอนนี้ คุณจะได้เรียนรู้วิธีใช้ 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
- หากเงื่อนไขเป็น
True
คำสั่งในif
body จะถูกดำเนินการและ - หากเงื่อนไขเป็น
False
คำสั่งในส่วนelse
จะถูกดำเนินการ
ในตัวอย่างนี้ เงื่อนไขคือตรวจสอบว่ามีคีย์อยู่ในพจนานุกรมหรือไม่
หากมีคีย์อยู่ในพจนานุกรม ตัวดำเนินการ 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()
จะคืนค่ากลับมา
- มิฉะนั้นจะส่งกลับค่าเริ่มต้น
ในตัวอย่างนี้ keys
คือรายการคีย์ที่มีค่าที่เราต้องการเข้าถึง เราวนซ้ำรายการคีย์เพื่อดึงค่าที่เกี่ยวข้องจากพจนานุกรม 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 - ภายในโมดูล collections
ดังนั้นคุณต้องนำเข้าไปยังสภาพแวดล้อมการทำงานของคุณ:
from collections import defaultdict
นี่คือไวยากรณ์ทั่วไปที่จะใช้ defaultdict
:
defaultdict(default_factory)
คุณสามารถระบุ callable เช่น int, float หรือ list เป็นแอตทริบิวต์ default_factory
หากคุณไม่ระบุค่า default_factory ค่า default_factory
จะเป็น None
เมื่อคีย์ที่คุณกำลังค้นหาไม่มีอยู่ __missing__()
จะถูกทริกเกอร์ และจะอนุมานค่าเริ่มต้นจาก default_factory
จากนั้นจะส่งกลับค่าเริ่มต้นนี้
สรุป:
- ใน Python
defaultdict
จะคืนค่าดีฟอลต์เมื่อไม่มีคีย์ - นอกจากนี้ยังเพิ่มคู่ค่าดีฟอลต์ของคีย์นี้ลงในพจนานุกรม ซึ่งคุณสามารถแก้ไขได้
Python Defaultdict ตัวอย่าง

ต่อไป เราจะโค้ดตัวอย่างบางส่วนเพื่อทำความเข้าใจว่า Python defaultdict ทำงานอย่างไร
Defaultdict ใน Python พร้อมค่าเริ่มต้น Integer Value
ขั้นแรก นำเข้า defaultdict
จากโมดูล collections
from collections import defaultdict import random
ให้เราสร้าง prices
ผิดนัด
prices = defaultdict(int)
ตอนนี้เราเติมพจนานุกรม prices
โดยใช้รายการ fruits
เป็นคีย์ และเราสุ่มตัวอย่างค่าจาก price_list
เพื่อรับค่า
price_list = [10,23,12,19,5] fruits = ['apple','strawberry','pomegranate','blueberry'] for fruit in fruits: prices[fruit] = random.choice(price_list)
มาดูคู่คีย์-ค่าในค่าผิดนัด prices
กัน
print(prices.items())
dict_items([('apple', 12), ('blueberry', 19), ('pomegranate', 5), ('strawberry', 10)])
เช่นเดียวกับพจนานุกรม Python ทั่วไป คุณสามารถเข้าถึงค่าของ prices
defaultdict โดยใช้คีย์:
prices['apple'] # 23
ทีนี้ลองมาดูราคาผลไม้ที่ไม่มีขายกัน ว่า 'ส้ม' กัน เราเห็นว่าจะส่งกลับ ค่าเริ่มต้น เป็นศูนย์
prices['orange'] # 0
หากเราพิมพ์พจนานุกรมออกมา เราจะเห็นว่าคีย์ใหม่ 'สีส้ม' ถูกเพิ่มด้วยค่าจำนวนเต็มเริ่มต้นเป็นศูนย์
print(prices.items())
dict_items([('apple', 12), ('blueberry', 19), ('pomegranate', 5), ('strawberry', 10), ('orange', 0)])
Defaultdict ใน Python พร้อมรายการเป็นค่าเริ่มต้น
มากำหนด students_majors
_majors เป็น defaultdict
ของรายการ ชื่อของวิชาเอกคือกุญแจ และค่านิยมคือรายชื่อของนักศึกษาที่เรียนวิชาเอกแต่ละวิชา เช่น คณิตศาสตร์ เศรษฐศาสตร์ วิทยาการคอมพิวเตอร์ และอื่นๆ
from collections import defaultdict students_majors = defaultdict(list)
หากเราพยายามเข้าถึงรายชื่อนักเรียนที่สอดคล้องกับ 'เศรษฐศาสตร์' defaultdict จะส่งกลับรายการว่าง ไม่มีข้อผิดพลาดที่สำคัญ!
students_majors['Economics'] # []
ตอนนี้เรามีรายการว่างที่แมปกับสาขาวิชา 'เศรษฐศาสตร์' ดังนั้นเราจึงสามารถเพิ่มองค์ประกอบในรายการนี้โดยใช้ list method .append()
students_majors['Economics'].append('Alex')
มีการสร้างรายการสำหรับ 'เศรษฐศาสตร์' ในพจนานุกรมเริ่มต้นของ students_majors
_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