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.