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

Python: เปรียบเทียบ List of Dictionaries หาความต่างได้เร็ว

การเปรียบเทียบ 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

MethodTime Complexityเหมาะสำหรับ
List ComprehensionO(n²)List เล็ก (< 1000 items)
Set + Tuple conversionO(n)List กลาง (1000-10000)
Pandas DataFrameO(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

บทความเกี่ยวข้อง