Python nested dictionary คือดิกชันนารีภายในอีกดิกชันนารีหนึ่ง นี่ช่วยให้คุณจัดเก็บข้อมูลโดยใช้โครงสร้างการแมปคีย์-ค่า (key-value mapping) ภายในดิกชันนารีที่มีอยู่
เมื่อคุณทำงานกับดิกชันนารีใน Python คุณอาจพบสถานการณ์ที่ดิกชันนารีมีอีกดิกชันนารีหนึ่งอยู่ภายใน
โครงสร้างข้อมูลนี้มักเรียกว่า nested dictionary, และมีกรณีการใช้งานที่หลากหลายในโค้ด Python
บทช่วยสอนนี้จะอภิปรายพื้นฐานของ nested dictionaries ใน Python เราจะเดินทางผ่านตัวอย่างไม่กี่ตัวอย่างเพื่อให้คุณเรียนรู้วิธาสร้างและแก้ไข nested dictionary
ทบทวน Python Dictionary (Python Dictionary Refresher)
ดิกชันนารีคือประเภทข้อมูลการแมป (mapping data type) ของ Python ดิกชันนารี Python ผูก หรือ แมป (map) — คีย์ไปยังค่า และให้วิธีที่มีประสิทธิภาพในการจัดเก็บข้อมูล
เมื่อคีย์ถูกแมปไปยังค่า คุณสามารถดึงข้อมูลที่จัดเก็บในค่านั้นโดยการอ้างอิงคีย์ ดังนั้นในความรู้สึกหนึ่ง คีย์ทำหน้าที่เหมือนป้ายกำกับ นี่คือตัวอย่างของดิกชันนารีที่จัดเก็บราคาของรสไอศกรีมที่ขายที่ร้านไอศกรีมท้องถิ่น The Frozen Spoon:
ice_cream_flavors = {
"Vanilla": 0.50,
"Chocolate": 0.50,
"Cookies and Cream": 0.75,
"Strawberry": 0.65,
"Buttered Pecan": 0.90
}
คีย์ในดิกชันนารีนี้คือชื่อไอศกรีมของเรา (เช่น "Vanilla") และค่าคือราคาต่อสกีปของแต่ละไอศกรีม
Python Nested Dictionary
Python nested dictionaries คือดิกชันนารีภายในดิกชันนารี พวกเขาใช้เพื่อแทนข้อมูลดิกชันนารีภายในอีกดิกชันนารี คุณสามารถซ้อนดิกชันนารีในดิกชันนารีได้ไม่จำกัดจำนวน
Nested dictionaries มีประโยชน์หากคุณต้องการจัดเก็บช่วงของดิกชันนารีส่วนประกอบในดิกชันนารีใหญ่หนึ่ง
มาเดินทางผ่านตัวอย่างเพื่อแสดงให้เห็นว่า nested dictionaries ทำงานอย่างไร สมมติว่าเราต้องการสร้างดิกชันนารีที่จัดเก็บดิกชันนารีเกี่ยวกับแต่ละรสไอศกรีมที่ขายที่ The Frozen Spoon ดิกชันนารีแต่ละอันในดิกชันนารีใหญ่ของเราควรแสดงรายการ:
- ชื่อของไอศกรีม
- ราคาของมัน
- จำนวนพินต์ที่มีในสต็อก
นี่คือรูปแบบของ nested dictionary ที่จัดเก็บข้อมูลนี้:
ice_cream_flavors = {
0: {
"flavor": "Vanilla",
"price": 0.50,
"pints": 20
},
1: {
"flavor": "Chocolate",
"price": 0.50,
"pints": 31
},
2: {
"flavor": "Cookies and Cream",
"price": 0.75,
"pints": 14
}
}
ในโค้ดของเรา เราได้ประกาศดิกชันนารีใหญ่หนึ่งชื่อ ice_cream_flavors ดิกชันนารีนี้มีสามดิกชันนารี แต่ละอันจัดเก็บข้อมูลเกี่ยวกับรสไอศกรีมเฉพาะ
หากเราไม่ใช้ nested dictionary เราจะต้องจัดเก็บดิกชันนารีแต่ละอันในตัวแปรแยกต่างหาก นี่เป็นสิ่งที่ขัดกับ直觉 เพราะแต่ละดิกชันนารีจัดเก็บข้อมูลเกี่ยวกับรสไอศกรีม
เข้าถึงรายการใน Nested Dictionary (Access Items in a Nested Dictionary)
เพื่อเข้าถึงรายการใน nested dictionary เราสามารถใช้ไวยากรณ์การจัดทำดัชนี (indexing syntax) ได้
สมมติว่าเราต้องการดึงราคาของไอศกรีมที่มีค่าดัชนี 0 ในดิกชันนารีของเรา เราสามารถทำได้โดยใช้โค้ดนี้:
ice_cream_flavors = {
0: { "flavor": "Vanilla", "price": 0.50, "pints": 20 },
1: { "flavor": "Chocolate", "price": 0.50, "pints": 31 },
2: { "flavor": "Cookies and Cream", "price": 0.75, "pints": 14 }
}
print(ice_cream_flavors[0]["price"])
print(ice_cream_flavors[0]["flavor"])
โค้ดของเราคืนค่า:
0.50 Vanilla
ในโค้ดนี้ เราระบุคีย์รายการที่ค่าของมันอยู่ในดิกชันนารีใหญ่ของเราที่เราต้องการดึง ในกรณีนี้ เราต้องการเข้าถึงเรคอร์ดที่มีค่าดัชนี 0
จากนั้น เราระบุชื่อของรายการในดิกชันนารีภายในที่เราต้องการดึง ในกรณีนี้ เราต้องการดึงราคาของไอศกรีมและรสชาติ ดังนั้นเราจึงระบุ price และ flavor ในคำสั่ง print() ทั้งสองของเรา
Nested Dictionary Python: เพิ่มองค์ประกอบ (Add Element)
เพื่อเพิ่มองค์ประกอบใน nested dictionary เราสามารถใช้ไวยากรณ์เดียวกันที่เราใช้แก้ไขรายการ ไม่มีเมธอดที่คุณควรใช้เพื่อเพิ่มรายการใน nested dictionary คุณต้องใช้ตัวดำเนินการกำหนดค่า (assignment operator)
ไวยากรณ์สำหรับการเพิ่มรายการมีดังนี้:
dictionary_name[new_key_name] = new_value
สมมติว่าเรามีดิกชันนารีที่จัดเก็บข้อมูลเกี่ยวกับไอศกรีมวานิลลาที่ขาย เราต้องการติดตามว่ามีส่วนลดสำหรับไอศกรีมหรือไม่ เราสามารถทำได้โดยใช้โค้ดต่อไปนี้:
ice_cream_flavors = {
0: { "flavor": "Vanilla", "price": 0.50, "pints": 20 },
1: { "flavor": "Chocolate", "price": 0.50, "pints": 31 },
2: { "flavor": "Cookies and Cream", "price": 0.75, "pints": 14 }
}
ice_cream_flavors[0]["discount"] = True
print(ice_cream_flavors[0])
มาเรียกโค้ดของเราและดูสิ่งที่เกิดขึ้น:
{'flavor': 'Vanilla', 'price': 0.5, 'pints': 20, 'discount': True}
ดิกชันนารีของเราจัดเก็บในตัวแปร Python "ice_cream_flavors"
เราเพิ่มคีย์ชื่อ discount เข้าไปในดิกชันนารี ตำแหน่งดัชนีของคีย์นี้คือ 0 เราตั้งค่าของคีย์นี้เป็น True จากนั้น เราพิมพ์ดิกชันนารีที่มีค่าดัชนี 0 ใน ice_cream_flavors nested dictionary ของเรา นี่แสดงให้เห็นว่าคีย์ discount ของเราถูกเพิ่มแล้ว
เราสามารถใช้ไวยากรณ์นี้เพื่ออัปเดตองค์ประกอบในดิกชันนารีที่มีอยู่ สมมติว่าเราต้องการเปลี่ยนราคาของไอศกรีมช็อกโกแลตเป็น $0.45 ต่อสกีป เราสามารถทำได้โดยใช้โค้ดนี้:
ice_cream_flavors = {
0: { "flavor": "Vanilla", "price": 0.50, "pints": 20 },
1: { "flavor": "Chocolate", "price": 0.50, "pints": 31 },
2: { "flavor": "Cookies and Cream", "price": 0.75, "pints": 14 }
}
ice_cream_flavors[1]["price"] = 0.45
print(ice_cream_flavors[1])
โค้ดของเราคืนค่า:
{'flavor': 'Chocolate', 'price': 0.45, 'pints': 31}
เราเปลี่ยนค่าของคีย์ price สำหรับไอศกรีมช็อกโกแลตของเราเป็น $0.45
เพื่อทำเช่นนี้ เราระบุค่าดัชนีของดิกชันนารีที่ค่า price ของเราต้องการเปลี่ยนเป็น 1 ค่านี้มีข้อมูลเกี่ยวกับไอศกรีมช็อกโกแลตในดิกชันนารีของเรา จากนั้น เรากำหนดค่าใหม่ให้กับคีย์ price
Nested Dictionary Python: ลบองค์ประกอบ (Delete Element)
เพื่อลบรายการที่จัดเก็บใน nested dictionary เราสามารถใช้คำสั่ง del คำสั่ง del ช่วยให้คุณลบออบเจ็กต์ del เขียนเหมือนคำสั่ง break ของ Python บนบรรทัดของตัวเอง ตามด้วยรายการในดิกชันนารีที่คุณต้องการลบ
สมมติว่าเราไม่ได้เสนอไอศกรีม Cookies and Cream ที่ร้านของเราชั่วคราว ตู้เย็นที่จัดเก็บไอศกรีม Cookies and Cream หยุดทำงานและสินค้าหลอมละลาย
เราสามารถลบไอศกรี้นี้ออกจาก nested dictionary ของเราโดยใช้โค้ดต่อไปนี้:
ice_cream_flavors = {
0: { "flavor": "Vanilla", "price": 0.50, "pints": 20 },
1: { "flavor": "Chocolate", "price": 0.50, "pints": 31 },
2: { "flavor": "Cookies and Cream", "price": 0.75, "pints": 14 }
}
del ice_cream_flavors[2]
print(ice_cream_flavors)
โค้ดของเราคืนค่า:
{0: {'flavor': 'Vanilla', 'price': 0.5, 'pints': 20}, 1: {'flavor': 'Chocolate', 'price': 0.5, 'pints': 31}}
ในโค้ดของเรา เราใช้คำสั่ง del เพื่อลบค่าใน nested dictionary ของเราที่คีย์เท่ากับ 2 ตามที่คุณเห็น นี่ได้ลบรายการสำหรับ Cookies and Cream ออกจาก nested dictionary ของเรา
วนซ้ำผ่าน Python Nested Dictionary (Iterate Through a Python Nested Dictionary)
ตอนนี้ สมมติว่าเราต้องการพิมพ์เนื้อหาของแต่ละดิกชันนารีใน nested dictionary ของเราไปที่คอนโซล เราสามารถทำภารกิจนี้ได้อย่างไร?
นี่คือคำถามที่ดี เพื่อพิมพ์เนื้อหาของ nested dictionary ของเรา เราสามารถวนซ้ำผ่านมันโดยใช้ลูป for ของ Python เราจะใช้เมธอด items() ของดิกชันนารี Python เพื่อดึงรายการของคีย์และค่าในดิกชันนารีของเรา:
ice_cream_flavors = {
0: { "flavor": "Vanilla", "price": 0.50, "pints": 20 },
1: { "flavor": "Chocolate", "price": 0.50, "pints": 31 },
2: { "flavor": "Cookies and Cream", "price": 0.75, "pints": 14 }
}
for key, value in ice_cream_flavors.items():
print("Ice Cream:", key)
for k, v in value.items():
print(k + ":", value[k])
โค้ดของเราคืนค่า:
Ice Cream: 0 flavor: Vanilla price: 0.5 pints: 20 Ice Cream: 1 flavor: Chocolate price: 0.5 pints: 31 Ice Cream: 2 flavor: Cookies and Cream price: 0.75 pints: 14
มาแยกวิเคราะห์โค้ดของเรา ก่อนอื่น เราได้กำหนด nested dictionary ของรสไอศกรีมของเรา
จากนั้น เราได้กำหนดลูป for ที่ผ่านแต่ละคีย์และค่าในดิกชันนารี ice_cream_flavors ลูปนี้ใช้ .items() เพื่อสร้างรายการของคีย์และค่าทั้งหมดในดิกชันนารี ice_cream_flavors ของเรา ซึ่งลูปสามารถวนซ้ำได้
จากนั้น เราพิมพ์ Ice Cream: ตามด้วยคีย์ที่เกี่ยวข้องกับไอศกรีมเฉพาะ
ต่อไป เราใช้ลูป for อีกอันหนึ่งเพื่อวนซ้ำผ่านทุกรายการในแต่ละ value ใน nested dictionary ของเรา นี้หมายถึงแต่ละรายการภายในใน nested dictionary ของเรา (เช่น สำหรับวานิลลาและช็อกโกแลต) ลูปนี้พิมพ์ชื่อของแต่ละคีย์ในดิกชันนารีภายในของเรา ตามด้วยทวิภาค แล้วค่าที่เกี่ยวข้องกับคีย์นั้น
สรุป
Nested dictionaries ช่วยให้คุณจัดเก็บดิกชันนารีภายในดิกชันนารีใน Python
บทช่วยสอนนี้อภิปราย พร้อมอ้างอิงตัวอย่าง วิธี:
- สร้าง nested dictionary
- เพิ่มองค์ประกอบและอัปเดตองค์ประกอบใน nested dictionary
- ลบองค์ประกอบจาก nested dictionary
- วนซ้ำผ่าน nested dictionary
หากต้องการเรียนรู้เพิ่มเติมเกี่ยวกับการเขียนโค้ดใน Python โปรดอ่านคู่มือ How to Code in Python ของเรา