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

Kiểm tra hai list of tuples có giống hệt nhau trong Python

Khi cần kiểm tra hai list of tuples có hoàn toàn giống nhau (cùng phần tử, cùng thứ tự) hay không, toán tử == có thể sử dụng trực tiếp.

Toán tử == so sánh giá trị của các iterable: kiểm tra độ dài và từng cặp phần tử tương ứng.

Ví dụ

list_1 = [(11, 14), (54, 58)]
list_2 = [(98, 0), (10, 13)]
list_3 = [(11, 14), (54, 58)]  # Giống list_1

print(f"List 1: {list_1}")
print(f"List 2: {list_2}")
print(f"List 3: {list_3}")

# So sánh trực tiếp
print(f"\nlist_1 == list_2: {list_1 == list_2}")  # False
print(f"list_1 == list_3: {list_1 == list_3}")    # True

# So sánh tuple of tuples
tuple_1 = ((11, 14), (54, 58))
tuple_2 = ((11, 14), (54, 58))
print(f"\ntuple_1 == tuple_2: {tuple_1 == tuple_2}")  # True

# So sánh list vs tuple (luôn False do khác kiểu)
print(f"list_1 == tuple_1: {list_1 == tuple_1}")  # False

Kết quả

List 1: [(11, 14), (54, 58)]
List 2: [(98, 0), (10, 13)]
List 3: [(11, 14), (54, 58)]

list_1 == list_2: False
list_1 == list_3: True

tuple_1 == tuple_2: True
list_1 == tuple_1: False

Giải thích

  • Toán tử == so sánh đệ quy: độ dài, sau đó từng phần tử.
  • Tuple so sánh với tuple, list so sánh với list -> True nếu nội dung giống hệt.
  • List so sánh với tuple -> luôn False dù nội dung giống nhau (khác type).
  • Cần chuyển đổi kiểu nếu muốn so sánh cross-type: tuple(list_1) == tuple_1.

So sánh không quan tâm thứ tự

# Dùng set (cần phần tử hashable)
list_a = [(1, 2), (3, 4)]
list_b = [(3, 4), (1, 2)]
print(set(list_a) == set(list_b))  # True

# Nếu có phần tử trùng lặp, dùng Counter
from collections import Counter
list_c = [(1, 2), (1, 2), (3, 4)]
list_d = [(3, 4), (1, 2), (1, 2)]
print(Counter(list_c) == Counter(list_d))  # True

So sánh gần đúng (fuzzy) - cho số thực

import math

def tuples_almost_equal(t1, t2, rel_tol=1e-9):
    if len(t1) != len(t2):
        return False
    return all(math.isclose(a, b, rel_tol=rel_tol) for a, b in zip(t1, t2))

print(tuples_almost_equal((1.0, 2.0), (1.0, 2.000000001)))  # True
print(tuples_almost_equal((1.0, 2.0), (1.0, 2.1)))           # False

So sánh lồng nhau (nested)

nested_1 = [(1, [2, 3]), (4, 5)]
nested_2 = [(1, [2, 3]), (4, 5)]
print(nested_1 == nested_2)  # True - list trong tuple cũng so sánh đệ quy