คุณควรใช้ Defaultdict ใน Python อย่างไรและเมื่อใด

เผยแพร่แล้ว: 2022-10-06

ในบทช่วยสอนนี้ คุณจะได้เรียนรู้วิธีใช้ defaultdict จากโมดูลคอลเลกชันของ Python เพื่อจัดการกับ KeyErrors ได้ดีขึ้น เมื่อทำงานกับพจนานุกรม Python

ใน Python พจนานุกรมคือโครงสร้างข้อมูลในตัวที่มีประสิทธิภาพซึ่งจัดเก็บข้อมูลในคู่คีย์-ค่า คุณจะใช้ปุ่มต่างๆ เพื่อแตะลงในพจนานุกรมและเข้าถึงค่าต่างๆ

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

ในบทช่วยสอนนี้ คุณจะได้เรียนรู้:

  • KeyErrors คืออะไรและเหตุใดจึงเกิดขึ้น
  • วิธีจัดการกับ KeyErrors
  • วิธีใช้ defaultdict ของ Python ซึ่งเป็นคลาสย่อยที่สืบทอดจากคลาส dict ในตัว เพื่อจัดการกับคีย์ที่หายไปได้ดียิ่งขึ้น

เอาล่ะ!

KeyErrors ใน Python คืออะไร?

1

เมื่อกำหนดพจนานุกรม 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-in-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

2

อีกวิธีหนึ่งที่ใช้กันทั่วไปในการจัดการ 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

python-defaultdict

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 ตัวอย่าง

Defaultdict-ตัวอย่าง-1

ต่อไป เราจะโค้ดตัวอย่างบางส่วนเพื่อทำความเข้าใจว่า 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