บทความนี้สาธิตวิธีทำ Cross Mapping ระหว่างสอง Dictionary ที่มีค่าเป็นลิสต์ โดยใช้ setdefault() และ extend()
โค้ดตัวอย่าง
# Dictionary แรก: Key → ลิสต์ค่า
my_dict_1 = {"Python": [4, 7], "Fun": [8, 6]}
# Dictionary ที่สอง: Key → ลิสต์ค่า
my_dict_2 = {6: [5, 7], 8: [3, 6], 7: [9, 8]}
print("Dict 1:", my_dict_1)
print("Dict 2:", my_dict_2)
# Cross Mapping
my_result = {}
for key, value_list in my_dict_1.items():
for index in value_list:
# หาค่าใน dict_2 ที่มี key = index
# ถ้าไม่เจอ ให้คืนลิสต์ว่าง []
mapped_values = my_dict_2.get(index, [])
# เพิ่มเข้าไปใน result
my_result.setdefault(key, []).extend(mapped_values)
print("\nผลลัพธ์ Cross Mapping:")
print(my_result)
ผลลัพธ์
Dict 1: {'Python': [4, 7], 'Fun': [8, 6]}
Dict 2: {6: [5, 7], 8: [3, 6], 7: [9, 8]}
ผลลัพธ์ Cross Mapping:
{'Python': [9, 8], 'Fun': [3, 6, 5, 7]}
อธิบายขั้นตอน
| Key (Dict1) | Value List | Lookup ใน Dict2 | ผลรวม |
|---|---|---|---|
| Python | [4, 7] | 4→ไม่เจอ, 7→[9,8] | [9, 8] |
| Fun | [8, 6] | 8→[3,6], 6→[5,7] | [3, 6, 5, 7] |
การใช้ setdefault() และ extend()
my_result.setdefault(key, []).extend(mapped_values)
# setdefault(key, []) → ถ้า key ไม่มี ให้สร้าง key: [] แล้วคืน []
# extend([...]) → เพิ่มทุกสมาชิกจากลิสต์เข้าไป
การประยุกต์ใช้
- การ Map ID ระหว่างระบบ (Entity Resolution)
- Graph Traversal: Node → Neighbors → Neighbors of Neighbors
- ETL Pipeline: แปลงรหัสระหว่างระบบต่างๆ
- Recommendation: User → Items → Similar Items
เวอร์ชัน Dictionary Comprehension
my_result = {
key: [v for idx in vals for v in my_dict_2.get(idx, [])]
for key, vals in my_dict_1.items()
}
print(my_result) # ผลลัพธ์เหมือนกัน