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

⚡ Tóm tắt thông minh

Xóa các mục trùng lặp khỏi Python Việc tạo danh sách có thể được thực hiện bằng một số phương pháp tích hợp sẵn, bao gồm set(), dict.fromkeys(), vòng lặp, list comprehensions và các phương thức thư viện từ NumPy và Pandas, mỗi phương thức đều cân bằng giữa việc bảo toàn thứ tự và tốc độ.

  • 🔘 Đặt phương pháp: Phương thức set() trả về các phần tử khác nhau ngay lập tức nhưng không giữ nguyên thứ tự ban đầu của danh sách.
  • ☑️ Trật tự được giữ nguyên: dict.fromkeys() và OrderedDict loại bỏ các phần tử trùng lặp trong khi vẫn giữ lại các phần tử đó.ping thứ tự chèn được nhìn thấy đầu tiên.
  • Điều khiển bằng tay: Vòng lặp for hoặc biểu thức tạo danh sách có kiểm tra phần tử còn lại sẽ giữ nguyên cấu trúc và dễ đọc.
  • 🧪 Phương pháp thư viện: Phương thức `unique()` của NumPy và `unique()` của Pandas loại bỏ dữ liệu trùng lặp và trả về danh sách thông qua phương thức `tolist()`.
  • 🛠️ Giới hạn khả năng băm: Các khóa của tập hợp và từ điển yêu cầu các phần tử có thể băm được, vì vậy danh sách hoặc từ điển cần một phương pháp dựa trên vòng lặp.
  • 🤖 Quy trình làm việc của AI: Các quy trình học máy loại bỏ dữ liệu huấn luyện trùng lặp bằng cách sử dụng Pandas drop_duplicates() để ngăn ngừa sai lệch và rò rỉ dữ liệu.

Xóa các mục trùng lặp khỏi danh sách trong Python

Python xóa các bản sao khỏi danh sách

Một danh sách là một vùng chứa chứa các Python các đối tượng, có thể là số nguyên, từ, giá trị, v.v. Nó tương đương với một mảng trong các ngôn ngữ lập trình khác.

Vậy ở đây chúng ta sẽ xem xét các cách khác nhau để loại bỏ các phần tử trùng lặp khỏi một danh sách cho trước. Python.

Phương pháp 1) Xóa các bản sao khỏi danh sách bằng Set

Để loại bỏ các phần tử trùng lặp khỏi một danh sách, bạn có thể sử dụng hàm tích hợp sẵn `set()`. Đặc điểm của phương thức `set()` là nó trả về các phần tử khác nhau.

Chúng ta có một danh sách: [1,1,2,3,2,2,4,5,6,2,1]. Danh sách này có nhiều phần tử trùng lặp mà chúng ta cần loại bỏ và chỉ giữ lại các phần tử khác nhau. Danh sách này được truyền cho hàm tích hợp set(). Later Danh sách cuối cùng được hiển thị bằng cách sử dụng hàm tích hợp list().

Kết quả mà chúng ta nhận được là các phần tử riêng biệt, trong đó tất cả các phần tử trùng lặp đã được loại bỏ.

Ví dụ

my_list = [1,1,2,3,2,2,4,5,6,2,1]
my_final_list = set(my_list)
print(list(my_final_list))

Đầu ra:

[1, 2, 3, 4, 5, 6]

Phương pháp 2) Sử dụng danh sách tạm thời

Để loại bỏ các phần tử trùng lặp khỏi một danh sách cho trước, bạn có thể sử dụng một danh sách tạm thời trống. Để làm điều đó, trước tiên bạn phải lặp qua danh sách có chứa các phần tử trùng lặp và thêm các phần tử duy nhất vào danh sách tạm thời. Later danh sách tạm thời được gán vào danh sách chính.

Ví dụ

Dưới đây là một ví dụ thực tế sử dụng danh sách tạm thời.

my_list = [1, 2, 3, 1, 2, 4, 5, 4 ,6, 2]
print("List Before ", my_list)
temp_list = []

for i in my_list:
    if i not in temp_list:
        temp_list.append(i)

my_list = temp_list

print("List After removing duplicates ", my_list)

Đầu ra:

List Before  [1, 2, 3, 1, 2, 4, 5, 4, 6, 2]
List After removing duplicates  [1, 2, 3, 4, 5, 6]

Phương pháp 3) Sử dụng Dict

Chúng ta có thể loại bỏ các phần tử trùng lặp khỏi danh sách đã cho bằng cách nhập OrderedDict từ collections. Lớp này có sẵn từ Python 2.7 trở lên. OrderedDict sẽ trả về các phần tử khác nhau theo thứ tự xuất hiện của khóa.

Chúng ta hãy sử dụng một danh sách và phương thức fromkeys() có sẵn trong OrderedDict để lấy các phần tử duy nhất từ ​​danh sách đó.

Để sử dụng phương thức OrderedDict.fromkeys(), bạn phải nhập OrderedDict từ collections, như được hiển thị bên dưới:

from collections import OrderedDict

Dưới đây là một ví dụ về cách loại bỏ các phần tử trùng lặp bằng phương thức OrderedDict.fromkeys().

Ví dụ

from collections import OrderedDict

my_list = ['a','x','a','y','a','b','b','c']

my_final_list = OrderedDict.fromkeys(my_list)

print(list(my_final_list))

Đầu ra:

['a', 'x', 'y', 'b', 'c']

Từ Python Từ phiên bản 3.5 trở đi, chúng ta có thể sử dụng phương thức dict.fromkeys() thông thường để lấy các phần tử khác nhau từ danh sách. Phương thức dict.fromkeys() trả về các khóa duy nhất và giúp loại bỏ các giá trị trùng lặp.

Ví dụ sau đây minh họa cách hoạt động của dict.fromkeys() trên một danh sách để trả về các phần tử duy nhất:

Ví dụ

my_list = ['a','x','a','y','a','b','b','c']
my_final_list = dict.fromkeys(my_list)
print(list(my_final_list))

Đầu ra:

['a', 'x', 'y', 'b', 'c']

Cách 4) Sử dụng vòng lặp for

Sử dụng vòng lặp, chúng ta sẽ duyệt qua danh sách các mục để loại bỏ các mục trùng lặp.

Đầu tiên, khởi tạo mảng rỗng, tức là myFinallist = []. Bên trong vòng lặp for, hãy thêm điều kiện kiểm tra xem các phần tử trong danh sách có tồn tại trong mảng myFinallist hay không. Nếu các phần tử không tồn tại, hãy thêm phần tử đó vào mảng myFinallist bằng phương thức append().

Vì vậy, bất cứ khi nào gặp phải phần tử trùng lặp, nó sẽ đã có sẵn trong mảng myFinallist và sẽ không được chèn vào. Chúng ta hãy kiểm tra điều này trong ví dụ dưới đây:

Ví dụ

my_list = [1,2,2,3,1,4,5,1,2,6]
myFinallist = []
for i in my_list:
    if i not in myFinallist:
myFinallist.append(i)
print(list(myFinallist))

Đầu ra:

[1, 2, 3, 4, 5, 6]

Phương pháp 5) Sử dụng tính năng hiểu danh sách

Danh sách hiểu là Python các hàm được sử dụng để tạo các chuỗi mới (chẳng hạn như danh sách, từ điển, v.v.) bằng cách sử dụng các chuỗi đã được tạo. Điều này giúp bạn giảm các vòng lặp dài hơn và làm cho mã của bạn dễ đọc và bảo trì hơn.

Chúng ta hãy sử dụng khả năng hiểu danh sách để loại bỏ các bản sao khỏi danh sách đã cho.

Ví dụ

my_list = [1,2,2,3,1,4,5,1,2,6]
my_finallist = []
[my_finallist.append(n) for n in my_list if n not in my_finallist]
print(my_finallist)

Đầu ra:

[1, 2, 3, 4, 5, 6]

Phương pháp 6) Sử dụng phương thức unique() của NumPy

Phương thức `unique()` từ mô-đun `NumPy` có thể giúp chúng ta loại bỏ các phần tử trùng lặp khỏi danh sách đã cho.

Để làm việc với NumPy, trước tiên hãy nhập mô-đun numpy:

Bước 1) Nhập mô-đun NumPy

import numpy as np

Bước 2) Sử dụng danh sách có chứa các phần tử trùng lặp bên trong phương thức `unique()`. Kết quả sẽ được chuyển đổi trở lại thành danh sách bằng phương thức `tolist()`.

myFinalList = np.unique(my_list).tolist()

Bước 3) Cuối cùng, in danh sách ra:

print(myFinalList)

Mã cuối cùng với đầu ra như sau:

import numpy as np
my_list = [1,2,2,3,1,4,5,1,2,6]
myFinalList = np.unique(my_list).tolist()
print(myFinalList)

Đầu ra:

[1, 2, 3, 4, 5, 6]

Phương pháp 7) Sử dụng phương pháp Pandas

Mô-đun Pandas có phương thức Unique() sẽ cung cấp cho chúng ta các phần tử duy nhất từ ​​danh sách đã cho.

Để làm việc với mô-đun Pandas:

Bước 1) Nhập mô-đun Pandas

import pandas as pd

Bước 2) Sử dụng danh sách có chứa các phần tử trùng lặp bên trong phương thức unique():

myFinalList = pd.unique(my_list).tolist()

Bước 3) In danh sách ra:

print(myFinalList)

Mã cuối cùng với đầu ra như sau:

import pandas as pd

my_list = [1,2,2,3,1,4,5,1,2,6]
myFinalList = pd.unique(my_list).tolist()
print(myFinalList)

Đầu ra:

[1, 2, 3, 4, 5, 6]

Phương pháp 8) Sử dụng enumerate() và hiểu danh sách

Ở đây, chúng ta sử dụng sự kết hợp giữa list comprehension và enumerate() để loại bỏ các phần tử trùng lặp. Enumerate trả về một đối tượng với một bộ đếm cho mỗi phần tử trong danh sách. Ví dụ: (0,1), (1,2), v.v. Ở đây, giá trị đầu tiên là chỉ số, và giá trị thứ hai là phần tử trong danh sách.

Mỗi phần tử được kiểm tra xem có tồn tại trong danh sách hay không, và nếu có, nó sẽ bị xóa khỏi danh sách.

Ví dụ

my_list = [1,2,2,3,1,4,5,1,2,6]
my_finallist = [i for j, i in enumerate(my_list) if i not in my_list[:j]]
print(list(my_finallist))

Đầu ra:

[1, 2, 3, 4, 5, 6]

Câu Hỏi Thường Gặp

Không. Tập hợp là một tập hợp không có thứ tự, vì vậy set() có thể trả về các phần tử theo thứ tự khác nhau. Để loại bỏ các phần tử trùng lặp trong khi vẫn giữ nguyên thứ tự, hãy sử dụng dict.fromkeys() hoặc một vòng lặp chỉ thêm các mục chưa được thấy trước đó.

Đối với các danh sách lớn, set() là nhanh nhất khi thứ tự không quan trọng vì việc kiểm tra thành viên là O(1). Khi thứ tự quan trọng, list(dict.fromkeys(my_list)) gần như nhanh bằng và giữ nguyên thứ tự xuất hiện đầu tiên trên một dòng.

Các phương thức `set()` và `dict.fromkeys()` cần các phần tử có thể băm được, vì vậy chúng sẽ không hoạt động với danh sách hoặc từ điển. Hãy lặp qua danh sách và thêm các mục chưa được thấy, hoặc chuyển đổi mỗi mục thành một bộ dữ liệu (tuple) hoặc chuỗi JSON làm khóa tạm thời.

Sử dụng list(dict.fromkeys(my_list)). Vì Python Từ điển phiên bản 3.7 bảo toàn thứ tự chèn, do đó các khóa vẫn giữ nguyên thứ tự xuất hiện đầu tiên. Trên các phiên bản cũ hơn, hãy sử dụng collections.OrderedDict.fromkeys() để có kết quả tương tự.

Không. Các phương thức như set(), dict.fromkeys(), comprehensions, và unique() của NumPy hoặc Pandas tạo ra một danh sách mới và giữ nguyên danh sách nguồn. Gán lại kết quả cho cùng một biến nếu bạn muốn ghi đè lên nó.

Sử dụng numpy.unique() hoặc pandas.unique() khi dữ liệu đã nằm trong mảng hoặc Series, hoặc trong quá trình phân tích dữ liệu. Lưu ý rằng numpy.unique() cũng sắp xếp các giá trị, trong khi pandas.unique() giữ nguyên thứ tự xuất hiện đầu tiên. Gọi tolist() cho một danh sách thông thường.

Các quy trình học máy loại bỏ các hàng trùng lặp trước khi huấn luyện để các mẫu lặp lại không làm sai lệch mô hình hoặc rò rỉ giữa tập huấn luyện và tập kiểm tra. Hàm `drop_duplicates()` của Pandas là công cụ phổ biến để làm sạch các tập dữ liệu dạng bảng.

Đúng vậy. GitHub Copilot và các trợ lý AI tự động tạo ra mã set(), dict.fromkeys() hoặc mã loại bỏ trùng lặp Pandas từ một bình luận, đề xuất tùy chọn giữ nguyên thứ tự và tái cấu trúc các vòng lặp, mặc dù bạn vẫn nên kiểm tra các trường hợp ngoại lệ như các mục không thể băm được.

Tóm tắt bài viết này với: