Cách sử dụng hàm filter() trong Python

Tìm hiểu cách sử dụng hàm filter() của Python để trích xuất các phần tử từ bộ sưu tập. So sánh bộ lọc với khả năng hiểu danh sách và lệnh gọi lại lambda.

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

Tổng quan

Lọc dữ liệu là một nhiệm vụ cốt lõi trong lập trình ứng dụng. Bạn thường sẽ cần tìm kiếm trong danh sách và trích xuất các phần tử đáp ứng tiêu chí cụ thể, chẳng hạn như trích xuất người dùng đang hoạt động từ cơ sở dữ liệu hồ sơ hoặc lọc số âm từ nhật ký cảm biến. Python cung cấp một công cụ chức năng tích hợp có tên là `filter()` cho mục đích này.

Hàm `filter(function, iterable)` nhận một hàm lọc và một iterable làm đối số. Đối số của hàm phải trả về giá trị boolean (`True` hoặc `False`) cho mỗi phần tử. Hàm `filter()` đánh giá từng phần tử, chỉ giữ lại những phần tử đánh giá là `True` và trả về một đối tượng iterator (đối tượng `filter`) chứa kết quả.

Giống như `map()`, `filter()` đánh giá các phần tử một cách lười biếng. Nếu bạn cần một danh sách tiêu chuẩn ngay lập tức, bạn truyền kết quả đầu ra bằng cách sử dụng hàm tạo `list()`: `list(filter(func, data))`. Nếu bạn chuyển `None` làm tham số hàm (ví dụ: `filter(None, data)`), Python sẽ tự động lọc ra tất cả các phần tử sai, đây là một cách viết tắt tuyệt vời để xóa các giá trị trống.

Đầu ra mã & thực thi

Tập lệnh này minh họa việc lọc mảng số, trích xuất các mục từ điển và loại bỏ các chuỗi trống giả bằng filter().

numbers = [-5, -2, 0, 3, 8, -1]

# 1. Filter positive numbers using a lambda function
positives = list(filter(lambda x: x > 0, numbers))
print("Positives only:", positives)

# 2. Filter list of strings by character length
words = ["cat", "elephant", "dog", "giraffe"]
long_words = list(filter(lambda w: len(w) > 4, words))
print("Words longer than 4 chars:", long_words)

# 3. Shorthand: Remove all falsy values from a list by passing None
mixed_data = ["hello", "", "world", None, False, "active"]
clean_data = list(filter(None, mixed_data))
print("Falsy values removed:", clean_data)
Đầu ra thiết bị đầu cuối
Positives only: [3, 8]
Words longer than 4 chars: ['elephant', 'giraffe']
Falsy values removed: ['hello', 'world', 'active']

Triển khai từng bước

  • Xác định hàm chấp nhận một phần tử và trả về giá trị boolean đại diện cho tiêu chí lọc.
  • Gọi filter(function, iterable) để tạo một trình lặp lặp lười biếng của các kết quả khớp.
  • Truyền đối tượng bộ lọc kết quả vào danh sách bằng cách sử dụng list(filter(...)) nếu bạn cần thao tác với các bản ghi.
  • Chuyển Không làm đối số hàm để lọc ra tất cả các giá trị giả (như Không, 0 và chuỗi trống).

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

Điều gì xảy ra nếu hàm được truyền cho filter() không trả về boolean?

Python đánh giá tính trung thực của giá trị trả về. Nếu giá trị được đánh giá là True trong ngữ cảnh boolean thì phần tử sẽ được giữ lại.

Tôi có nên sử dụng filter() hoặc hiểu danh sách không?

Việc hiểu danh sách với điều kiện if (ví dụ: [x for x in list if condition]) thường được ưu tiên vì dễ đọc, nhưng filter() sạch sẽ và có hiệu suất cao, đặc biệt khi sử dụng các hàm dựng sẵn hiện có.

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.