Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Python

Tìm phần tử khác nhau giữa các tuple trong Python

Khi cần tìm các phần tử khác nhau (dissimilar/symmetric difference) giữa hai nested tuple, có thể chuyển thành set và dùng toán tử ^ (XOR - symmetric difference).

set chỉ chứa phần tử duy nhất.

Toán tử ^ trên set trả về phần tử chỉ xuất hiện ở MỘT trong hai set (không phải cả hai).

Ví dụ

tuple_1 = ((7, 8), (3, 4), (3, 2))
tuple_2 = ((9, 6), (8, 2), (1, 4))

print(f"Tuple 1: {tuple_1}")
print(f"Tuple 2: {tuple_2}")

# Chuyển thành set để dùng phép toán tập hợp
set_1 = set(tuple_1)
set_2 = set(tuple_2)

print(f"\nSet 1: {set_1}")
print(f"Set 2: {set_2}")

# Symmetric difference: phần tử chỉ ở 1 trong 2 set
diff = set_1 ^ set_2
# Hoặc: diff = set_1.symmetric_difference(set_2)

result = tuple(diff)
print(f"\nPhần tử khác nhau (symmetric difference): {result}")

# So sánh với các phép toán khác
print(f"\nUnion (hợp): {set_1 | set_2}")
print(f"Intersection (giao): {set_1 & set_2}")
print(f"Difference 1-2 (chỉ ở 1): {set_1 - set_2}")
print(f"Difference 2-1 (chỉ ở 2): {set_2 - set_1}")

Kết quả

Tuple 1: ((7, 8), (3, 4), (3, 2))
Tuple 2: ((9, 6), (8, 2), (1, 4))
Set 1: {(3, 4), (7, 8), (3, 2)}
Set 2: {(9, 6), (8, 2), (1, 4)}
Phần tử khác nhau (symmetric difference): ((3, 4), (9, 6), (1, 4), (8, 2), (3, 2), (7, 8))
Union (hợp): {(3, 4), (7, 8), (3, 2), (9, 6), (8, 2), (1, 4)}
Intersection (giao): set()
Difference 1-2 (chỉ ở 1): {(3, 4), (7, 8), (3, 2)}
Difference 2-1 (chỉ ở 2): {(9, 6), (8, 2), (1, 4)}

Giải thích

  • Hai nested tuple không có phần tử nào trùng nhau -> giao rỗng, symmetric difference = union.
  • ^ (XOR) trả về tất cả phần tử vì không có phần tử chung.
  • Kết quả chuyển về tuple (thứ tự ngẫu nhiên do set).

Ví dụ có phần tử chung

t1 = ((1, 2), (3, 4), (5, 6))
t2 = ((3, 4), (5, 6), (7, 8))

print(f"t1: {t1}")
print(f"t2: {t2}")
print(f"Symmetric diff: {tuple(set(t1) ^ set(t2))}")
# ((1, 2), (7, 8)) - chỉ (3,4) và (5,6) chung

Tìm phần tử khác nhau cho tuple phẳng (flat tuple)

flat_1 = (1, 2, 3, 4, 5)
flat_2 = (4, 5, 6, 7, 8)

print(f"Flat symmetric diff: {tuple(set(flat_1) ^ set(flat_2))}")
# (1, 2, 3, 6, 7, 8) - loại 4,5 chung

Giữ thứ tự xuất hiện (ordered symmetric difference)

def ordered_symmetric_diff(t1, t2):
    """Trả về phần tử khác nhau, giữ thứ tự: trước t1 rồi t2."""
    set2 = set(t2)
    set1 = set(t1)
    # Phần tử chỉ ở t1 (theo thứ tự t1)
    only_t1 = [x for x in t1 if x not in set2]
    # Phần tử chỉ ở t2 (theo thứ tự t2)
    only_t2 = [x for x in t2 if x not in set1]
    return tuple(only_t1 + only_t2)

print(ordered_symmetric_diff(t1, t2))  # ((1, 2), (7, 8))

Ứng dụng: So sánh cấu hình

config_old = (('host', 'localhost'), ('port', 8080), ('debug', True))
config_new = (('host', 'localhost'), ('port', 9000), ('ssl', True))

changes = set(config_old) ^ set(config_new)
print("Cấu hình thay đổi:")
for item in changes:
    print(f"  {item}")
# (('port', 8080), ('port', 9000), ('debug', True), ('ssl', True))