Cách xóa danh sách trùng lặp khỏi danh sách trong Python

Tìm hiểu cách xóa các bản sao khỏi danh sách bằng Python trong khi duy trì hoặc bỏ qua thứ tự. So sánh các chuyển đổi tập hợp, khóa chính tả và phương thức vòng lặp.

Hãy thử Giải pháp này trong Trình chỉnh sửa

Tổng quan

Dữ liệu trùng lặp thường xuyên lọt vào danh sách thông qua tìm nạp cơ sở dữ liệu, tương tác của người dùng hoặc tổng hợp nhật ký. Loại bỏ các bản sao này là bước làm sạch dữ liệu cơ bản nhằm đảm bảo tính duy nhất và ngăn chặn sự dư thừa trong logic xuôi dòng. Python cung cấp một số kỹ thuật để đạt được điều này, từ chuyển đổi tập hợp nhanh đến các hoạt động dựa trên vòng lặp tôn trọng thứ tự phần tử.

Cách nhanh nhất và phổ biến nhất để loại bỏ các phần tử trùng lặp là chuyển đổi danh sách thành một `set` bằng cách sử dụng hàm tạo `set()`, sau đó chuyển đổi nó trở lại danh sách. Vì các bộ không thể chứa các giá trị trùng lặp nên quá trình này sẽ tự động loại bỏ các giá trị trùng lặp. Hạn chế của phương pháp này là các tập hợp không có thứ tự, nghĩa là chuỗi các phần tử ban đầu bị mất.

Để giữ nguyên thứ tự ban đầu của các phần tử trong khi loại bỏ các phần tử trùng lặp,Python 3.7+ đưa ra một giải pháp thông minh bằng cách sử dụng lớp từ điển tích hợp sẵn: `list(dict.fromkeys(my_list))`. Vì các khóa từ điển là duy nhất và giữ nguyên thứ tự chèn nên phương pháp này loại bỏ các phần tử trùng lặp một cách hiệu quả trong khi vẫn giữ nguyên chuỗi. Đối với các tiêu chí tùy chỉnh hoặc các phiên bản Python cũ hơn, vòng lặp thủ công sử dụng bộ trợ giúp để theo dõi các phần tử đã thấy cũng có hiệu quả cao.

Đầu ra mã & thực thi

Tập lệnh này minh họa việc loại bỏ các phần tử danh sách trùng lặp bằng cách sử dụng các bộ, khóa từ điển và vòng lặp thủ công.

numbers = [2, 1, 2, 3, 1, 4]

# Method 1: Using set() (Unordered)
unique_unordered = list(set(numbers))
print("Unordered unique:", unique_unordered)

# Method 2: Using dict.fromkeys() (Preserves order)
unique_ordered = list(dict.fromkeys(numbers))
print("Ordered unique:", unique_ordered)

# Method 3: Using a loop with a seen helper
seen = set()
unique_loop = []
for item in numbers:
    if item not in seen:
        seen.add(item)
        unique_loop.append(item)
print("Loop unique:", unique_loop)
Đầu ra thiết bị đầu cuối
Unordered unique: [1, 2, 3, 4]
Ordered unique: [2, 1, 3, 4]
Loop unique: [2, 1, 3, 4]

Triển khai từng bước

  • Chuyển đổi danh sách thành một bộ để loại bỏ trùng lặp ngay lập tức bằng cách sử dụng set(my_list).
  • Sử dụng list(dict.fromkeys(my_list)) để xóa các bản sao trong khi vẫn giữ nguyên thứ tự chèn.
  • Sử dụng bộ trợ giúp trong vòng lặp để lọc các bản sao nếu bạn cần xác thực tùy chỉnh.

Câu hỏi thường gặp

Phương pháp nào là nhanh nhất cho danh sách lớn?

Chuyển đổi thành một bộ là nhanh nhất nhờ tối ưu hóa cấp độ C, theo sát là dict.fromkeys().

Làm cách nào để loại bỏ trùng lặp danh sách từ điển?

Vì từ điển không thể băm được nên bạn không thể sử dụng trực tiếp các bộ. Bạn phải sử dụng tính năng lọc vòng lặp hoặc danh sách hiểu theo ID/khóa duy nhất.

Chủ đề liên quan

Tài nguyên Python được đề xuất

Mở rộng kiến thức của bạn với các hướng dẫn tương tác, bảng ghi chú và so sánh mã có liên quan.