Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

Python: ดึง Key ที่ไม่ซ้ำกันจาก List of Dictionaries

บทนำ

เมื่อมีลิสต์ของดิกชันนารี และต้องการรวบรวม 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"