5 phương pháp để loại bỏ các mục trùng lặp khỏi danh sách Python

Spread the love

Trong hướng dẫn này, bạn sẽ học cách xóa các mục trùng lặp khỏi danh sách Python.

Khi bạn đang làm việc với danh sách bằng Python, đôi khi bạn có thể chỉ cần làm việc với các mục duy nhất trong danh sách – bằng cách loại bỏ các bản sao.

Có một số cách khác nhau để bạn có thể làm điều này. Trong hướng dẫn này, chúng ta sẽ xem xét năm kỹ thuật như vậy.

Khái niệm cơ bản về danh sách Python

Hãy bắt đầu cuộc thảo luận của chúng ta bằng cách xem lại những điều cơ bản về danh sách Python.

Danh sách Python là có thể thay đổi. Vì vậy, bạn có thể sửa đổi chúng tại chỗ bằng cách thêm và xóa các phần tử khỏi danh sách. Ngoài ra, danh sách Python là tập hợp các phần tử không nhất thiết phải là duy nhất.

Vì vậy, làm thế nào để bạn chỉ giữ lại các phần tử duy nhất và loại bỏ các phần tử trùng lặp hoặc lặp lại?

Bạn có thể làm điều này theo một số cách khác nhau. Bạn có thể tạo một danh sách mới chỉ chứa các phần tử duy nhất trong danh sách ban đầu. Hoặc bạn có thể chọn sửa đổi danh sách ban đầu tại chỗ và loại bỏ các mục trùng lặp.

Chúng ta sẽ tìm hiểu những điều này một cách chi tiết trong hướng dẫn này.

Các phương pháp để loại bỏ các bản sao khỏi danh sách Python

Hãy lấy một ví dụ trong thế giới thực. Giả sử bạn đang dự tiệc sinh nhật của bạn mình.🎊🎉

Trong bộ sưu tập đồ ngọt được trưng bày, bạn thấy có một số món được lặp lại. Bây giờ bạn muốn xóa những món trùng lặp đó khỏi danh sách đồ ngọt.

Hãy tạo một danh sách đồ ngọt có chứa tất cả các món trong hình trên.

sweets = ["cupcake","candy","lollipop","cake","lollipop","cheesecake","candy","cupcake"]

Trong danh sách đồ ngọt ở trên, các món ‘kẹo’ và ‘bánh cupcake’ được lặp lại hai lần. Hãy sử dụng danh sách ví dụ này để loại bỏ các mục trùng lặp.

Lặp lại các danh sách Python để loại bỏ các bản sao

Phương pháp đơn giản nhất là tạo một danh sách mới chứa mỗi mục chính xác một lần.

Đọc qua ô mã bên dưới:

unique_sweets = []
for sweet in sweets:
  if sweet not in unique_sweets:
    unique_sweets.append(sweet)

print(unique_sweets)

# Output
['cupcake', 'candy', 'lollipop', 'cake', 'cheesecake']
  • Chúng tôi khởi tạo một danh sách trống unique_sweets.
  • Trong khi lướt qua danh sách đồ ngọt, chúng tôi truy cập từng đồ ngọt.
  • Nếu sweet chưa có trong danh sách unique_sweets, chúng tôi thêm nó vào cuối danh sách unique_sweets bằng phương thức .append ().
  Cách truy cập iCloud trên PC

Giả sử bạn bắt gặp một mặt hàng lặp lại, ví dụ: lần xuất hiện thứ hai của ‘kẹo’ trong danh sách đồ ngọt. Điều này không được thêm vào danh sách unique_sweets vì nó đã có sẵn: sweet không có trong unique_sweets đánh giá là Sai cho lần xuất hiện thứ hai của ‘cupcake’ và ‘candy’.

Do đó, trong phương pháp này, mọi mục xuất hiện chính xác một lần trong danh sách unique_sweets — mà không có bất kỳ sự lặp lại nào.

Sử dụng tính năng hiểu danh sách để loại bỏ các bản trùng lặp

Bạn cũng có thể sử dụng khả năng hiểu danh sách để điền danh sách unique_sweets.

Bạn muốn làm mới kiến ​​thức cơ bản về khả năng hiểu danh sách?

▶ ️ Xem hướng dẫn về khả năng hiểu danh sách bằng Python.

Hãy sử dụng biểu thức hiểu danh sách: [output for item in iterable if condition is True] để viết lại ngắn gọn vòng lặp trên.

unique_sweets = []
[unique_sweets.append(sweet) for sweet in sweets if sweet not in unique_sweets]
print(unique_sweets)

# Output
['cupcake', 'candy', 'lollipop', 'cake', 'cheesecake']

Ngay cả khi bạn đang tạo một danh sách mới, bạn không điền các giá trị vào danh sách đã tạo. Điều này là do đầu ra là hoạt động .append () cho danh sách unique_sweets.

Để xóa các mục trùng lặp khỏi danh sách Python, bạn cũng có thể sử dụng các phương pháp danh sách tích hợp sẵn và chúng tôi sẽ đề cập đến vấn đề này trong phần tiếp theo.

Sử dụng các phương pháp danh sách tích hợp để loại bỏ các bản trùng lặp

Bạn có thể sử dụng các phương thức danh sách Python .count () và .remove () để loại bỏ các mục trùng lặp.

– Với cú pháp list.count (value), phương thức .count () trả về số lần giá trị xuất hiện trong list. Vì vậy, số đếm tương ứng với các mục lặp lại sẽ lớn hơn 1.

– list.remove (value) xóa lần xuất hiện đầu tiên của giá trị khỏi danh sách.

Sử dụng ở trên, chúng tôi có mã sau.

for sweet in sweets:
  # check if the count of sweet is > 1 (repeating item)
  if sweets.count(sweet) > 1:
  # if True, remove the first occurrence of sweet
    sweets.remove(sweet)

print(sweets)

# Output
['cake', 'lollipop', 'cheesecake', 'candy', 'cupcake']

Vì phương thức .remove () chỉ xóa lần xuất hiện đầu tiên của một giá trị, bạn không thể sử dụng nó để xóa các mục xuất hiện nhiều hơn hai lần.

  • Nếu một mục cụ thể bị trùng lặp (xảy ra chính xác hai lần), phương pháp này sẽ loại bỏ lần xuất hiện đầu tiên.
  • Nếu một mục cụ thể được lặp lại K lần, thì sau khi chạy đoạn mã trên, các lần lặp lại K-1 sẽ vẫn còn.

Nhưng nói chung, khi chúng ta nói các bản sao, chúng ta thường đề cập đến tất cả các lần lặp lại.

Để xử lý trường hợp này, bạn có thể sửa đổi vòng lặp trên để loại bỏ tất cả các lần lặp lại ngoại trừ một lần lặp lại. Thay vì sử dụng if có điều kiện để kiểm tra số lượng của một mục cụ thể, bạn có thể chạy một vòng lặp while để loại bỏ lặp lại nhiều lần cho đến khi số lượng của mọi mục trong danh sách là 1.

  8 công cụ kiểm tra dòng tiêu đề email tốt nhất để sử dụng trước khi bạn gửi bản tin

Danh sách đồ ngọt hiện có 2 lần lặp lại ‘cupcake’ và 3 lần lặp lại ‘kẹo’.

sweets = ["cupcake","candy","lollipop","cake","lollipop","candy","cheesecake","candy","cupcake"]

Bạn có thể sử dụng vòng lặp while để loại bỏ các lần lặp lại, như hình dưới đây. Vòng lặp while tiếp tục chạy miễn là số lượng kẹo ngọt lớn hơn 1. Khi chỉ còn một lần xuất hiện, điều kiện sweets.count (sweet)> 1 trở thành Sai và vòng lặp bỏ qua mục tiếp theo.

for sweet in sweets:
  # check if the count of sweet is > 1 (repeating item)
  while(sweets.count(sweet) > 1):
  # repeatedly remove the first occurrence of sweet until one occurrence remains.
    sweets.remove(sweet)

print(sweets)
# Output
['cake', 'lollipop', 'cheesecake', 'candy', 'cupcake']

Nhưng sử dụng các vòng lặp lồng nhau có thể không hiệu quả lắm, vì vậy bạn có thể cân nhắc sử dụng một trong các kỹ thuật khác đã được thảo luận nếu bạn đang làm việc với các danh sách lớn.

Cho đến nay, chúng tôi đã học được những điều sau:

  • Phương pháp xóa các mục trùng lặp khỏi danh sách Python — bằng cách tạo danh sách mới — chỉ chứa các mục duy nhất
  • Các phương thức danh sách tích hợp sẵn .count () và .remove () để sửa đổi danh sách tại chỗ

Có một số cấu trúc dữ liệu tích hợp sẵn trong Python yêu cầu các giá trị phải là duy nhất — không lặp lại. Do đó, chúng ta có thể truyền một danh sách Python tới một trong những cấu trúc dữ liệu này để loại bỏ các bản sao. Và sau đó chuyển đổi chúng trở lại một danh sách. Chúng ta sẽ tìm hiểu cách thực hiện điều này trong các phần sắp tới.

Truyền danh sách Python thành một tập hợp để loại bỏ các bản trùng lặp

Tập hợp Python là tập hợp các phần tử là duy nhất. Do đó, số phần tử có trong tập hợp (do len ( đưa ra) bằng số phần tử duy nhất hiện có.

Bạn có thể truyền bất kỳ Python nào có thể lặp lại thành một tập hợp bằng cách sử dụng cú pháp: set (có thể lặp lại).

Bây giờ, hãy đúc danh sách kẹo thành một tập hợp và kiểm tra kết quả đầu ra.

set(sweets)
# Output
{'cake', 'candy', 'cheesecake', 'cupcake', 'lollipop'}

Từ kết quả đầu ra trong ô mã trên, chúng ta thấy rằng mọi mục xuất hiện đúng một lần và các mục trùng lặp đã bị loại bỏ.

Ngoài ra, hãy lưu ý rằng thứ tự của các mặt hàng không nhất thiết phải giống với thứ tự của chúng trong danh sách đồ ngọt ban đầu. Điều này là do, bên cạnh việc là một tập hợp các phần tử duy nhất, một đối tượng tập hợp Python còn là một tập hợp không có thứ tự.

Bây giờ chúng ta đã loại bỏ các bản sao bằng cách truyền danh sách thành một tập hợp, chúng ta có thể chuyển đổi lại nó thành một danh sách, như được hiển thị bên dưới.

unique_sweets = list(set(sweets))
print(unique_sweets)

# Output
['cake', 'cheesecake', 'candy', 'cupcake', 'lollipop']

Sử dụng các mục trong danh sách làm khóa từ điển để loại bỏ các từ trùng lặp

Từ điển Python là một tập hợp các cặp khóa-giá trị trong đó các khóa xác định duy nhất các giá trị.

  Cách gọi lại email trong Gmail

Bạn có thể tạo từ điển Python bằng phương thức .fromkeys () với cú pháp: dict.fromkeys (khóa, giá trị). Ở đây, khóa và giá trị là các vòng lặp chứa các khóa và giá trị của từ điển, tương ứng.

  • khóa là một tham số bắt buộc và nó có thể là bất kỳ Python nào có thể lặp lại tương ứng với các khóa của từ điển.
  • giá trị là một tham số tùy chọn. Nếu bạn không chỉ định các giá trị có thể lặp lại, giá trị mặc định của Không có sẽ được sử dụng.

Không chỉ định các giá trị, dict.fromkeys (sweets) trả về một từ điển Python trong đó các giá trị được đặt thành Không – giá trị mặc định. Ô mã bên dưới giải thích điều này.

dict.fromkeys(sweets)

# Output
{'cake': None,
 'candy': None,
 'cheesecake': None,
 'cupcake': None,
 'lollipop': None}

Như với phần trước, chúng ta có thể chuyển từ điển thành danh sách một lần nữa, như hình dưới đây.

unique_sweets = list(dict.fromkeys(sweets))
print(unique_sweets)
# Output
['cupcake', 'candy', 'lollipop', 'cake', 'cheesecake']

Từ kết quả ở trên, chúng ta có thể thấy rằng các mục trùng lặp đã bị loại bỏ khỏi kẹo danh sách.

Tổng kết👩‍🏫

Dưới đây là bản tóm tắt về các phương pháp khác nhau mà bạn có thể sử dụng để xóa các mục trùng lặp hoặc lặp lại khỏi danh sách Python.

  • Sử dụng phương thức danh sách Python .append () để thêm các mục không lặp lại vào danh sách mới. Danh sách mới chứa mỗi mục trong danh sách ban đầu chính xác một lần và loại bỏ tất cả các mục lặp lại. Bạn cũng có thể làm điều này bằng cách sử dụng khả năng hiểu danh sách.
  • Sử dụng các phương thức .count () và .remove () được tích hợp sẵn để loại bỏ các mục xảy ra đúng hai lần. Điều tương tự có thể được đặt trong vòng lặp while để loại bỏ tất cả các lần xuất hiện bổ sung.
  • Truyền một danh sách Python thành một tập hợp để chỉ giữ lại các phần tử duy nhất.
  • Sử dụng dict.fromkeys (danh sách) để xóa bất kỳ bản sao nào khỏi danh sách vì không có khóa lặp lại của từ điển.

Tiếp theo, hãy xem các dự án Python để thực hành và học hỏi. Hoặc tìm hiểu cách tìm chỉ mục của một mục trong danh sách Python. Chúc các bạn học vui vẻ!

x