Khi cần xóa các phần tử trùng lặp khỏi một tuple, cách phổ biến là chuyển thành set (tự động loại trùng lặp) rồi chuyển lại tuple.
Lưu ý: set không giữ thứ tự phần tử. Nếu cần giữ thứ tự, xem phần "Giữ thứ tự" dưới.
Ví dụ cơ bản (không giữ thứ tự)
# List of tuples (ví dụ gốc dùng list of tuples)
my_list = [(11, 14), (0, 78), (33, 11), (0, 78)]
print(f"List ban đầu: {my_list}")
# Chuyển sang set -> loại trùng lặp -> chuyển lại list
unique_list = list(set(my_list))
print(f"List sau khi loại trùng lặp: {unique_list}")
# Nếu input là tuple
my_tuple = ((11, 14), (0, 78), (33, 11), (0, 78))
unique_tuple = tuple(set(my_tuple))
print(f"Tuple sau khi loại trùng lặp: {unique_tuple}")
Kết quả
List ban đầu: [(11, 14), (0, 78), (33, 11), (0, 78)] List sau khi loại trùng lặp: [(33, 11), (11, 14), (0, 78)] Tuple sau khi loại trùng lặp: ((33, 11), (11, 14), (0, 78))
Giải thích
set(my_list)tạo tập hợp chỉ chứa các tuple duy nhất.- Thứ tự có thể thay đổi do bản chất của set (unordered).
list()hoặctuple()chuyển về kiểu mong muốn.
Giữ nguyên thứ tự xuất hiện (Order Preserving)
def unique_preserve_order(seq):
"""Loại trùng lặp giữ thứ tự xuất hiện đầu tiên."""
seen = set()
result = []
for item in seq:
if item not in seen:
seen.add(item)
result.append(item)
return type(seq)(result) # Trả về cùng kiểu (tuple/list)
# Test
my_tuple = ((11, 14), (0, 78), (33, 11), (0, 78), (11, 14))
print(f"Gốc: {my_tuple}")
print(f"Unique (giữ thứ tự): {unique_preserve_order(my_tuple)}")
# ((11, 14), (0, 78), (33, 11))
Python 3.7+: Dùng dict.fromkeys() (ngắn gọn, giữ thứ tự)
# dict.fromkeys() giữ thứ tự chèn từ Python 3.7 my_tuple = ((11, 14), (0, 78), (33, 11), (0, 78)) unique_tuple = tuple(dict.fromkeys(my_tuple)) print(unique_tuple) # ((11, 14), (0, 78), (33, 11))
Loại trùng lặp trong tuple phẳng (flat tuple)
flat_tuple = (1, 2, 3, 2, 4, 1, 5) # Không giữ thứ tự print(tuple(set(flat_tuple))) # (1, 2, 3, 4, 5) - thứ tự ngẫu nhiên # Giữ thứ tự print(tuple(dict.fromkeys(flat_tuple))) # (1, 2, 3, 4, 5) - giữ thứ tự
So sánh hiệu năng
set(): Nhanh nhất O(n), nhưng mất thứ tự.dict.fromkeys(): O(n), giữ thứ tự (Python 3.7+), khuyến nghị dùng.- Vòng lặp +
seenset: O(n), giữ thứ tự, hoạt động mọi phiên bản Python.