การรวมพจนานุกรม Python: คู่มือฉบับสมบูรณ์พร้อมโค้ด

目次

1. บทนำ

พจนานุกรม (dict) ของ Python เป็นโครงสร้างข้อมูลที่สะดวกสำหรับการจัดการข้อมูลในรูปแบบคู่ key-value มีสถานการณ์หลายอย่างที่คุณต้องรวมพจนานุกรมเข้าด้วยกัน—ตัวอย่างเช่น เมื่อรวมไฟล์การตั้งค่าหลายไฟล์หรือรวมชุดข้อมูลที่แตกต่างกัน

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

2. วิธีพื้นฐานสำหรับการรวมพจนานุกรม

Python มีวิธีการหลายอย่างในการรวมพจนานุกรม ก่อนอื่น เราจะอธิบายวิธีพื้นฐาน

2.1 การใช้เมธอด update()

คุณสมบัติ

เมธอด update() เป็นวิธีพื้นฐานที่สุดในการรวมพจนานุกรมหนึ่งเข้าไปในอีกพจนานุกรมหนึ่ง การดำเนินการนี้เป็นแบบทำลายล้าง (มันแก้ไขพจนานุกรมต้นฉบับ) ดังนั้นโปรดระวังหากคุณต้องการรักษาเนื้อหาของพจนานุกรมต้นฉบับ

ตัวอย่างโค้ด

dict1 = {'a': 1, 'b': 2}
dict2 = {'b': 3, 'c': 4}

dict1.update(dict2)
print(dict1)  # {'a': 1, 'b': 3, 'c': 4}

คำอธิบาย

ในโค้ดด้านบน dict2 ถูกรวมเข้าไปใน dict1 หากมีคีย์ที่ซ้ำกัน ค่าจากพจนานุกรมที่รวมทีหลัง (ในกรณีนี้คือ dict2) จะเขียนทับ

กรณีการใช้งาน

  • เมื่อยอมรับได้ที่จะแก้ไขพจนานุกรมต้นฉบับ
  • เมื่อคุณต้องการวิธีที่เรียบง่ายและมีประสิทธิภาพ

2.2 การใช้ตัวดำเนินการ unpacking (**)

คุณสมบัติ

ตั้งแต่ Python 3.5 คุณสามารถใช้ตัวดำเนินการ unpacking (**) เพื่อรวมพจนานุกรม วิธีนี้เป็นแบบไม่ทำลายล้าง (ไม่แก้ไขต้นฉบับ) และสร้างพจนานุกรมใหม่

ตัวอย่างโค้ด

dict1 = {'a': 1, 'b': 2}
dict2 = {'b': 3, 'c': 4}

combined_dict = {**dict1, **dict2}
print(combined_dict)  # {'a': 1, 'b': 3, 'c': 4}

คำอธิบาย

วิธีนี้ขยายพจนานุกรมหลายตัวเพื่อสร้างพจนานุกรมใหม่ หากคีย์ทับซ้อนกัน ค่าจากพจนานุกรมที่ระบุทีหลัง (dict2) จะมีลำดับความสำคัญ

กรณีการใช้งาน

  • เมื่อคุณต้องการพจนานุกรมใหม่โดยไม่แก้ไขต้นฉบับ
  • เมื่อความสามารถในการอ่านได้มีความสำคัญ

2.3 การใช้ตัวดำเนินการ merge (|)

คุณสมบัติ

เริ่มจาก Python 3.9 ตัวดำเนินการ | ถูกแนะนำเพื่อให้สามารถรวมพจนานุกรมได้อย่างกระชับ วิธีนี้ยังเป็นแบบไม่ทำลายล้างและสร้างพจนานุกรมใหม่

ตัวอย่างโค้ด

dict1 = {'a': 1, 'b': 2}
dict2 = {'b': 3, 'c': 4}

combined_dict = dict1 | dict2
print(combined_dict)  # {'a': 1, 'b': 3, 'c': 4}

คำอธิบาย

วิธีนี้ช่วยให้คุณรวมพจนานุกรมได้อย่าง intuitive มันปรับปรุงความสามารถในการอ่านโค้ดและเข้าใจง่ายสำหรับผู้เริ่มต้น Python

กรณีการใช้งาน

  • เมื่อใช้ Python 3.9 ขึ้นไป
  • เมื่อคุณต้องการไวยากรณ์ที่เรียบง่ายและเข้าใจง่าย
年収訴求

3. การรวมพจนานุกรมในกรณีพิเศษ

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

3.1 การใช้ constructor dict()

คุณสมบัติ

วิธีนี้ใช้ constructor dict() เพื่อรวมพจนานุกรมหลายตัว มันเป็นประโยชน์เมื่อคุณต้องการระบุค่าที่เพิ่มเติมโดยตรงสำหรับพจนานุกรมหรือสร้างพจนานุกรมใหม่ที่รวมพจนานุกรมที่ unpack แล้ว

ตัวอย่างโค้ด

dict1 = {'a': 1, 'b': 2}
dict2 = {'c': 3}

combined_dict = dict(dict1, **dict2)
print(combined_dict)  # {'a': 1, 'b': 2, 'c': 3}

คำอธิบาย

  • dict1 เป็นฐาน และ dict2 ถูก unpack ทับเพื่อดำเนินการรวม
  • โปรดทราบว่าเพราะใช้ตัวดำเนินการ ** คีย์ของ dict2 ต้องเป็นสตริง

กรณีการใช้งาน

  • เมื่อคุณต้องการเพิ่มคีย์และค่าที่ใหม่นอกเหนือจากการรวมพจนานุกรมพื้นฐาน
  • ต้องการเวอร์ชัน Python 3.5 ขึ้นไป

3.2 การใช้ collections.ChainMap

คุณสมบัติ

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

ตัวอย่างโค้ด

from collections import ChainMap

dict1 = {'a': 1, 'b': 2}
dict2 = {'b': 3, 'c': 4}

combined = ChainMap(dict1, dict2)
print(combined['b'])  # 2
print(combined['c'])  # 4

คำอธิบาย

  • ChainMap จัดการพจนานุกรมหลายรายการเหมือนกับพจนานุกรมเสมือนจริงเดียว
  • การค้นหาคีย์จะทำเป็นลำดับความสำคัญจากพจนานุกรมแรกที่ระบุ ในตัวอย่างนี้ สำหรับ 'b' ค่าจาก dict1 ( 2 ) จะถูกเลือก

กรณีการใช้งาน

  • เมื่อคุณต้องการจัดการพจนานุกรมแบบไดนามิกโดยไม่รวมจริงๆ
  • เมื่อจัดการข้อมูลจำนวนมากและต้องการให้ความสำคัญกับประสิทธิภาพหน่วยความจำ

4. ข้อควรระวังสำหรับการรวมพจนานุกรม

มีหลายประเด็นที่ต้องระวังเมื่อรวมพจนานุกรม การเข้าใจสิ่งเหล่านี้สามารถช่วยป้องกันข้อผิดพลาดที่ไม่คาดคิดและความไม่สอดคล้องของข้อมูล

4.1 พฤติกรรมของคีย์ที่ซ้ำ

เมื่อรวมพจนานุกรม หากมีคีย์ที่ซ้ำ ค่าจากพจนานุกรมที่ระบุทีหลังจะมีลำดับความสำคัญ

ตัวอย่าง

dict1 = {'a': 1, 'b': 2}
dict2 = {'b': 3, 'c': 4}

combined = {**dict1, **dict2}
print(combined)  # {'a': 1, 'b': 3, 'c': 4}

ในตัวอย่างนี้ สำหรับคีย์ 'b' ค่า dict2 (3) จะถูกเลือก สำคัญที่จะเข้าใจพฤติกรรมนี้

4.2 ความแตกต่างของประสิทธิภาพ

ประสิทธิภาพอาจแตกต่างกันไปตามวิธีที่ใช้ในการรวมพจนานุกรม ให้ความสนใจเป็นพิเศษเมื่อทำงานกับข้อมูลจำนวนมาก

การเปรียบเทียบประสิทธิภาพ (ภาพรวม)

  • เมธอด update() มีประสิทธิภาพแต่แก้ไขพจนานุกรมต้นฉบับ ทำให้ไม่เหมาะหากคุณต้องการเก็บสำรอง
  • ตัวดำเนินการ Unpack (**) ไม่ทำลายและสะดวก แต่เพิ่มการใช้งานหน่วยความจำเมื่อจัดการข้อมูลจำนวนมาก
  • ChainMap ไม่รวมพจนานุกรมจริงๆ ดังนั้นจึงประหยัดหน่วยความจำ
RUNTEQ(ランテック)|超実戦型エンジニア育成スクール

5. การเปรียบเทียบวิธีการและคู่มือการเลือก

เปรียบเทียบวิธีการต่างๆ สำหรับการรวมพจนานุกรมและให้คำแนะนำในการเลือกแนวทางที่เหมาะสม

5.1 ตารางเปรียบเทียบวิธีการ

วิธี

ทำลาย/ไม่ทำลาย

Version

พฤติกรรมกุญแจซ้ำ

ประสิทธิภาพ

update()

ทำลาย

All versions

พจนานุกรมที่มาหลังนี้มีความสำคัญเหนือกว่า

เร็ว

ตัวดำเนินการแยก (**)

ไม่ทำลาย

3.5 และใหม่กว่า

พจนานุกรมภายหลังมีความสำคัญสูงกว่า

ปานกลาง

Merge operator (|)

ไม่ทำลาย

3.9 และรุ่นถัดไป

พจนานุกรมที่มาหลังจะมีความสำคัญกว่า

ปานกลาง

ChainMap

ไม่ทำลาย

All versions

พจนานุกรมแรกมีความสำคัญเหนือกว่า

ประสิทธิภาพหน่วยความจำสูง

5.2 คู่มือการเลือก

  • สำหรับ Python 3.9 ขึ้นไป :
  • เราแนะนำตัวดำเนินการ | สำหรับความเรียบง่ายและความอ่านง่าย
  • สำหรับ Python 3.5–3.8 :
  • แนะนำให้ใช้ตัวดำเนินการ unpacking ( ** )
  • หากจัดการชุดข้อมูลขนาดใหญ่หรือให้ความสำคัญกับประสิทธิภาพหน่วยความจำ :
  • ดีที่สุดคือใช้ ChainMap
  • หากยอมรับการดำเนินการที่ทำลาย :
  • เมธอด update() มีประสิทธิภาพ

6. คำถามที่พบบ่อย (FAQ)

ส่วนนี้ตอบคำถามทั่วไปที่ผู้อ่านมีเกี่ยวกับการรวมพจนานุกรมใน Python และอธิบายสาเหตุของข้อผิดพลาดและวิธีจัดการกรณีพิเศษ

6.1 ทำไมเกิดข้อผิดพลาดเมื่อรวมพจนานุกรม?

ตัวอย่างปัญหา

การรันโค้ดต่อไปนี้จะเกิดข้อผิดพลาด

dict1 = {'a': 1, 'b': 2}
dict2 = {('c',): 3}

combined_dict = {**dict1, **dict2}

สาเหตุ

เมื่อใช้ตัวดำเนินการ unpacking (**) คีย์ต้องเป็นสตริง มิฉะนั้นจะเกิดข้อผิดพลาด ในตัวอย่างข้างต้น คีย์ ('c',) ใน dict2 เป็น tuple ซึ่งทำให้เกิดข้อผิดพลาด

วิธีแก้ไข

หากคีย์ไม่ใช่สตริง ใช้เมธอด update() หรือรวมพจนานุกรมด้วยตนเองโดยใช้ลูป

dict1 = {'a': 1, 'b': 2}
dict2 = {('c',): 3}

dict1.update(dict2)  # Works correctly
print(dict1)  # {'a': 1, 'b': 2, ('c',): 3}

6.2 ทางเลือกอื่นคืออะไรหากต้องการใช้ตัวดำเนินการ | บนเวอร์ชัน Python ก่อน 3.9?

คำตอบ

บนเวอร์ชัน Python ก่อน 3.9 ไม่สามารถใช้ตัวดำเนินการ | ได้ แต่สามารถทำผลลัพธ์เดียวกันโดยใช้ตัวดำเนินการ unpacking (**)

ตัวอย่าง

คุณสามารถใช้โค้ดต่อไปนี้บน Python 3.8 และก่อนหน้านั้น

dict1 = {'a': 1, 'b': 2}
dict2 = {'b': 3, 'c': 4}

combined_dict = {**dict1, **dict2}
print(combined_dict)  # {'a': 1, 'b': 3, 'c': 4}

6.3 คุณจะรวมพจนานุกรมซ้อนกันอย่างไร?

Problem

ปัญหา

เมื่อทำการรวมพจนานุกรมซ้อนกัน วิธีปกติอาจไม่ทำงานตามที่คาดหวัง

dict1 = {'a': {'x': 1}}
dict2 = {'a': {'y': 2}}

combined_dict = {**dict1, **dict2}
print(combined_dict)  # {'a': {'y': 2}}

ในตัวอย่างข้างต้น คีย์ 'a' ถูกเขียนทับโดย dict2 และค่าของ dict1 จะหายไป

Solution

วิธีแก้

เพื่อรวมพจนานุกรมซ้อนกันคุณต้องใช้วิธีแบบเรียกซ้ำ (recursive)

def merge_dicts(d1, d2):
    result = d1.copy()
    for key, value in d2.items():
        if key in result and isinstance(result[key], dict) and isinstance(value, dict):
            result[key] = merge_dicts(result[key], value)
        else:
            result[key] = value
    return result

dict1 = {'a': {'x': 1}}
dict2 = {'a': {'y': 2}}

combined_dict = merge_dicts(dict1, dict2)
print(combined_dict)  # {'a': {'x': 1, 'y': 2}}

6.4 คุณสามารถรวมหลายพจนานุกรมพร้อมกันโดยใช้ตัวดำเนินการ merge ได้หรือไม่?

Answer

คำตอบ

ใน Python 3.9 ขึ้นไป เมื่อรวมหลายพจนานุกรมพร้อมกัน คุณต้องใช้ตัวดำเนินการ merge อย่างต่อื่อง

Example

ตัวอย่าง

dict1 = {'a': 1}
dict2 = {'b': 2}
dict3 = {'c': 3}

combined_dict = dict1 | dict2 | dict3
print(combined_dict)  # {'a': 1, 'b': 2, 'c': 3}

คุณยังสามารถบรรลุผลเดียวกันโดยใช้ตัวดำเนินการ unpacking

combined_dict = {**dict1, **dict2, **dict3}
print(combined_dict)  # {'a': 1, 'b': 2, 'c': 3}

6.5 วิธีที่ดีที่สุดในการรวมพจนานุกรมเมื่อทำงานกับข้อมูลขนาดใหญ่คืออะไร?

Answer

คำตอบ

เมื่อทำงานกับชุดข้อมูลขนาดใหญ่ การใช้ ChainMap สามารถรวมได้อย่างมีประสิทธิภาพ ChainMap ไม่ได้รวมพจนานุกรมจริง ๆ จึงช่วยลดการใช้หน่วยความจำ

Example

ตัวอย่าง

from collections import ChainMap

dict1 = {'a': 1}
dict2 = {'b': 2}

combined = ChainMap(dict1, dict2)
print(combined['a'])  # 1
print(combined['b'])  # 2

7. Summary

สรุป

บทความนี้อธิบายวิธีต่าง ๆ ในการรวมพจนานุกรมใน Python ครอบคลุมตั้งแต่พื้นฐานจนถึงเทคนิคล่าสุด พร้อมตัวอย่างที่เป็นรูปธรรมและเข้าใจง่ายสำหรับผู้เริ่มต้น

Key points

ประเด็นสำคัญ

  • เมธอด update() เป็นวิธีที่ง่ายและมีประสิทธิภาพในการแก้ไขพจนานุกรมต้นฉบับ
  • ตัวดำเนินการ unpacking (**) ไม่ทำลายข้อมูลเดิมและเหมาะสำหรับการสร้างพจนานุกรมใหม่
  • ตัวดำเนินการ merge (|) มีให้ใช้ใน Python 3.9 ขึ้นไป ทำให้โค้ดง่ายและอ่านง่ายขึ้น
  • ChainMap มีประโยชน์เมื่อจัดการกับข้อมูลขนาดใหญ่อย่างมีประสิทธิภาพและช่วยประหยัดหน่วยความจำ

แต่ละวิธีมีลักษณะเฉพาะของตนเอง ดังนั้นจึงสำคัญที่จะเลือกวิธีที่เหมาะสมตามเป้าหมายและสถานการณ์ของคุณ ตัวอย่างเช่น เมื่อประมวลผลข้อมูลขนาดใหญ่หรือหลีกเลี่ยงคีย์พจนานุกรมซ้ำซ้อน ChainMap หรือตัวดำเนินการ unpacking สามารถเป็นทางเลือกที่มีประสิทธิภาพ

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

侍エンジニア塾