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

Loại bỏ phần tử trùng lặp khỏi tuple trong Python

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ặc tuple() 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 + seen set: O(n), giữ thứ tự, hoạt động mọi phiên bản Python.