Thông báo: Download 4 khóa học Python từ cơ bản đến nâng cao tại đây.
Cách xóa phần tử trong danh sách Python
Một tác vụ phổ biến trong Python là lặp qua danh sách và xóa các phần tử dựa trên một điều kiện. Bài viết này sẽ giới thiệu các cách khác nhau để thực hiện điều này, đồng thời lưu ý một số lỗi cần tránh.

Giả sử chúng ta có danh sách a và cần xóa tất cả các phần tử không phải số chẵn. Dưới đây là một hàm hỗ trợ nhỏ để kiểm tra xem một số có phải là số chẵn hay không:
a = [1, 2, 2, 3, 4]
def even(x):
    return x % 2 == 0
Cách 1: Tạo danh sách mới chỉ chứa các phần tử cần giữ lại trong Python
Sử dụng List Comprehension
Bạn có thể sử dụng list comprehension để tạo một danh sách mới chỉ chứa các phần tử không bị xóa, sau đó gán lại vào biến a.
a = [x for x in a if not even(x)] # Kết quả: a = [1, 3]
Lưu ý: Bạn có thể tìm hiểu thêm về list comprehension trong hướng dẫn này.
Bài viết này được đăng tại [free tuts .net]
from itertools import filterfalse a[:] = filterfalse(even, a) # Kết quả: a = [1, 3]
Gán vào lát cắt (slice) a[:]
Thay vì tạo một biến mới, bạn có thể thay đổi danh sách gốc tại chỗ bằng cách gán vào lát cắt a[:]. Cách này hiệu quả hơn và hữu ích nếu có các tham chiếu khác đến danh sách a cần phản ánh thay đổi.
a[:] = [x for x in a if not even(x)] # Kết quả: a = [1, 3]
Sử dụng itertools.filterfalse()
Thư viện itertools cung cấp các hàm tối ưu hóa cho việc lặp, bao gồm filterfalse() để lọc phần tử:
from itertools import filterfalse a[:] = filterfalse(even, a) # Kết quả: a = [1, 3]
Cách 2: Lặp qua bản sao của danh sách trong Python
Nếu bạn muốn sử dụng cú pháp for, hãy lặp qua một bản sao của danh sách (bản sao được tạo bằng a[:]). Sau đó, bạn có thể xóa phần tử trong danh sách gốc nếu điều kiện đúng.
for item in a[:]:
    if even(item):
        a.remove(item)
# Kết quả: a = [1, 3]
Điều cần tránh trong Python
Không lặp qua danh sách và sửa đổi trực tiếp!
Khi bạn lặp qua danh sách và đồng thời sửa đổi nó, các phần tử phía sau phần tử bị xóa sẽ bị dời vị trí, dẫn đến việc bỏ sót các phần tử. Điều này có thể gây ra kết quả sai.
for item in a:
    if even(item):
        a.remove(item)
# Kết quả sai: a = [1, 2, 3] !!!
Không sửa đổi chỉ mục khi lặp!
Việc thay đổi giá trị của biến chỉ mục trong vòng lặp không ảnh hưởng đến chỉ mục ở lần lặp tiếp theo. Điều này có thể gây ra kết quả không mong muốn hoặc thậm chí lỗi IndexError.
for i in range(len(a)):
    if even(a[i]):
        del a[i]
        i -= 1
# Lỗi: IndexError: list index out of range
Kết bài
Khi xóa phần tử trong danh sách Python, bạn nên sử dụng list comprehension hoặc lặp qua bản sao của danh sách để đảm bảo kết quả chính xác. Hạn chế thay đổi danh sách gốc trực tiếp khi đang lặp để tránh các lỗi không mong muốn.

            Các kiểu dữ liệu trong C ( int - float - double - char ...)        
            Thuật toán tìm ước chung lớn nhất trong C/C++        
            Cấu trúc lệnh switch case trong C++ (có bài tập thực hành)        
            ComboBox - ListBox trong lập trình C# winforms        
            Random trong Python: Tạo số random ngẫu nhiên        
            Lệnh cin và cout trong C++        
                Cách khai báo biến trong PHP, các loại biến thường gặp            
                Download và cài đặt Vertrigo Server            
                Thẻ li trong HTML            
                Thẻ article trong HTML5            
                Cấu trúc HTML5: Cách tạo template HTML5 đầu tiên            
                Cách dùng thẻ img trong HTML và các thuộc tính của img            
                Thẻ a trong HTML và các thuộc tính của thẻ a thường dùng