บทนำ
เมื่อมีลิสต์ของดิกชันนารี และต้องการรวบรวม key ทั้งหมดที่ปรากฏ โดยไม่ซ้ำกัน สามารถใช้ set comprehension หรือ itertools.chain ได้อย่างมีประสิทธิภาพ
ตัวอย่างโค้ด (โค้ดต้นฉบับมีบั๊ก: ดึง values ไม่ใช่ keys)
my_list = [
{'hi': 11, 'there': 28},
{'how': 11, 'are': 31},
{'you': 28, 'Will': 31}
]
print("ลิสต์ดิกชันนารี:")
print(my_list)
# --- โค้ดต้นฉบับ (ดึง values - ผิดโจทย์) ---
wrong_result = list(set(value for dic in my_list for value in dic.values()))
print("\nผิด: ดึง values:", wrong_result) # [11, 28, 31]
# --- 修正: ดึง keys ที่ไม่ซ้ำกัน ---
correct_result = list(set(key for dic in my_list for key in dic.keys()))
print("ถูกต้อง: ดึง keys:", correct_result) # ['hi', 'there', 'how', 'are', 'you', 'Will']
ผลลัพธ์
ลิสต์ดิกชันนารี:
[{'hi': 11, 'there': 28}, {'how': 11, 'are': 31}, {'you': 28, 'Will': 31}]
ผิด: ดึง values: [11, 28, 31]
ถูกต้อง: ดึง keys: ['hi', 'there', 'how', 'are', 'you', 'Will']
วิธีทางเลือกอื่นๆ
1. ใช้ itertools.chain (เร็วที่สุดสำหรับข้อมูลใหญ่)
from itertools import chain
keys = list(set(chain.from_iterable(d.keys() for d in my_list)))
print(keys)
2. ใช้ dict.update() แบบสะสม
all_keys = {}
for d in my_list:
all_keys.update(d)
keys = list(all_keys.keys())
print(keys)
3. ใช้ set union (Python 3.9+)
keys = list(set().union(*[d.keys() for d in my_list]))
print(keys)
เปรียบเทียบประสิทธิภาพ
| วิธี | ความเร็ว | ความอ่านง่าย | หมายเหตุ |
|---|---|---|---|
| Set comprehension | เร็ว | สูง | แนะนำสำหรับทั่วไป |
| itertools.chain | เร็วที่สุด | ปานกลาง | เหมาะข้อมูลใหญ่มาก |
| dict.update() | ปานกลาง | สูง | รักษาลำดับ (Python 3.7+) |
กรณีใช้งานจริง
- สร้าง schema จากข้อมูล JSON หลายไฟล์
- ตรวจสอบความสมบูรณ์ของฟิลด์ใน dataset
- สร้างคอลัมน์สำหรับ DataFrame จาก records แบบไม่สม่ำเสมอ
สรุป
ใช้ list(set(key for d in my_list for key in d)) สำหรับโค้ดสั้นและอ่านง่าย หรือ itertools.chain สำหรับประสิทธิภาพสูงสุด โค้ดต้นฉบับในคำถามดึง values ซึ่งไม่ตรงกับโจทย์ "unique keys"