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

ในบทช่วยสอนนี้ คุณจะได้เรียนรู้วิธีใช้ 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 ได้อย่างไร?

  วิธีตรวจสอบ 5G Bands ที่รองรับบนโทรศัพท์ของคุณ

มีหลายวิธีที่จะทำ และเราจะเรียนรู้ในหัวข้อถัดไป

วิธีจัดการกับ 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() จะคืนค่ากลับมา
– มิฉะนั้นจะส่งกลับค่าเริ่มต้น

  สุดยอด Google ชีตคำถามที่พบบ่อย Cheat Sheet เพื่อคั่นหน้าสำหรับภายหลัง

ในตัวอย่างนี้ คีย์คือรายการคีย์ที่มีค่าที่เราต้องการเข้าถึง เราวนซ้ำรายการคีย์เพื่อดึงค่าที่เกี่ยวข้องจากพจนานุกรม 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 เป็นโครงสร้างข้อมูลที่ต้องการในโครงการของคุณเมื่อจำเป็น

  20 สุดยอดเครื่องสร้างชื่อโดเมนที่ดีที่สุด

นี่คือบทสรุปของสิ่งที่คุณได้เรียนรู้ในบทช่วยสอนนี้

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

ถัดไป ดูบทช่วยสอนเกี่ยวกับฟังก์ชันแผนที่ Python

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

x