บทความนี้สาธิตวิธีสร้าง Dictionary จาก List โดยใช้เมธอด setdefault() เพื่อจัดกลุ่มค่าตามคีย์ที่กำหนด
โค้ดตัวอย่าง
# สร้าง Dictionary ว่าง
my_dict = dict()
print("สร้าง Dictionary ว่างแล้ว")
# ลิสต์ค่า (เป็นสตริงตัวเลข)
my_value_list = ['15', '14', '13', '12', '16']
print(f"ลิสต์ต้นฉบับ: {my_value_list}")
# เรียงลำดับ
my_value_list.sort()
print(f"ลิสต์หลังเรียง: {my_value_list}")
# สร้าง Dictionary
# คีย์ = ตัวเลขจากลิสต์ และตัวเลข+1
# ค่า = ลิสต์ของค่าต้นฉบับที่สร้างคีย์นั้นได้
for value in my_value_list:
num = int(value)
for element in range(num, num + 2): # num และ num+1
my_dict.setdefault(element, []).append(value)
print("\nDictionary ผลลัพธ์:")
print(my_dict)
ผลลัพธ์
{12: ['12'], 13: ['12', '13'], 14: ['13', '14'], 15: ['14', '15'], 16: ['15', '16'], 17: ['16']}
อธิบาย Logic
สำหรับค่าแต่ละค่าในลิสต์ (เช่น '12'):
- แปลงเป็น int → 12
- สร้างคีย์ 12 และ 13 (range(12, 14))
- เพิ่มค่า '12' เข้าไปในลิสต์ของคีย์ 12 และ 13
setdefault(key, []) จะ:
- ถ้าคีย์ยังไม่มี → สร้างคีย์ใหม่พร้อมลิสต์ว่าง แล้วคืนค่าลิสต์นั้น
- ถ้าคีย์มีอยู่แล้ว → คืนค่าลิสต์เดิม
- จากนั้น
.append(value)เพิ่มค่าเข้าไปในลิสต์นั้น
รูปแบบอื่น: Dictionary Comprehension
# ถ้าต้องการแค่ Map ค่า → Index
my_list = ['15', '14', '13', '12', '16']
my_dict = {int(v): i for i, v in enumerate(my_list)}
print(my_dict)
# {15: 0, 14: 1, 13: 2, 12: 3, 16: 4}
การประยุกต์ใช้ setdefault()
- การจัดกลุ่มข้อมูล (Grouping) โดยไม่ต้องเช็ค key มีอยู่ก่อน
- การสร้าง Inverted Index
- การนับความถี่แบบจัดกลุ่ม