การเปรียบเทียบ 2 List of Dictionaries ใน Python ต้องพิจารณา Key และ Value ทั้งคู่ ลำดับไม่สำคัญ บทความนี้แสดงวิธีต่างๆ พร้อม Performance
1. การเปรียบเทียบพื้นฐาน (Equality Check)
list_1 = [
{'id': '123-abc', 'name': 'Mike', 'age': 40},
{'name': 'John', 'age': 34, 'id': '123-efg'},
{'age': 32, 'id': '123-xyz', 'name': 'Aly'}
]
list_2 = [
{'name': 'Mike', 'id': '123-abc', 'age': 40},
{'id': '123-efg', 'age': 34, 'name': 'John'},
{'id': '123-xyz', 'name': 'Aly', 'age': 32}
]
# Python เปรียบเทียบ Dict โดยดู Key-Value เท่านั้น (ลำดับ Key ไม่สำคัญ)
# และ List เปรียบเทียบตามลำดับ Element
print(list_1 == list_2) # True ✅
2. หาความต่าง (Print Differences)
list_1 = [
{'id': '123-abc', 'name': 'Mike', 'age': 40},
{'id': '123-efg', 'name': 'John', 'age': 24},
{'id': '123-xyz', 'name': 'Aly', 'age': 35}
]
list_2 = [
{'id': '123-abc', 'name': 'Mike', 'age': 40},
{'id': '123-efg', 'name': 'Jon', 'age': 24}, # name: Jon vs John
{'id': '123-xyz', 'name': 'Aly', 'age': 32} # age: 32 vs 35
]
# วิธีที่ 1: List Comprehension
diff = [item for item in list_1 if item not in list_2]
for d in diff:
print(d)
# {'id': '123-efg', 'name': 'John', 'age': 24}
# {'id': '123-xyz', 'name': 'Aly', 'age': 35}
3. Function แบบ Reusable (Return Boolean + Print Diff)
def compare_two_lists(list1: list, list2: list) -> bool:
"""
เปรียบเทียบ 2 List of Dicts
Returns: True ถ้าเหมือนกันทุกตัว, False ถ้าต่างกัน
"""
# Symmetric difference - หา item ที่อยู่ในฝั่งเดียว
diff = [item for item in list1 + list2 if item not in list1 or item not in list2]
if diff:
print(f'Found {len(diff)} differences:')
for d in diff[:5]: # แสดงแค่ 5 ตัวแรก
print(f" {d}")
return False
return True
# ใช้งาน
result = compare_two_lists(list_1, list_2)
print(f"Lists are equal: {result}")
4. ใช้ Pandas DataFrame (สำหรับ Dataset ใหญ่)
import pandas as pd
from pandas import DataFrame
def compare_with_pandas(list1: list, list2: list) -> bool:
df1 = pd.DataFrame(list1)
df2 = pd.DataFrame(list2)
# Merge with indicator
comparison = df1.merge(df2, indicator=True, how='outer')
diff = comparison[comparison['_merge'] != 'both']
if not diff.empty:
print(f'Found {len(diff)} differences:')
print(diff.head())
return False
return True
💡 ข้อดีของ Pandas: จัดการข้อมูลจำนวนมากได้ดี แสดงความต่างเป็นตาราง รองรับ NaN/Null comparison ได้ดีกว่า
Performance Comparison
| Method | Time Complexity | เหมาะสำหรับ |
|---|---|---|
| List Comprehension | O(n²) | List เล็ก (< 1000 items) |
| Set + Tuple conversion | O(n) | List กลาง (1000-10000) |
| Pandas DataFrame | O(n log n) | List ใหญ่ (> 10000) / Complex analysis |
5. Optimized: Set of Tuples (O(n))
def compare_fast(list1, list2):
# แปลง Dict → Tuple of sorted items (Hashable)
set1 = {tuple(sorted(d.items())) for d in list1}
set2 = {tuple(sorted(d.items())) for d in list2}
diff1 = set1 - set2 # ใน list1 แต่ไม่อยู่ list2
diff2 = set2 - set1 # ใน list2 แต่ไม่อยู่ list1
return diff1, diff2