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