Trong quá trình xử lý dữ liệu, việc chọn lọc những phần tử phù hợp luôn là nhu cầu phổ biến khi làm việc với Python. Thay vì phải sử dụng các vòng lặp phức tạp, lập trình viên có thể tận dụng hàm filter trong Python để rút gọn mã nguồn và nâng cao hiệu suất xử lý một cách hiệu quả. Công cụ này không chỉ giúp tối ưu hóa logic mà còn mang lại cách viết code rõ ràng, dễ bảo trì hơn. Bài viết dưới đây của APTECH SAIGON sẽ giúp bạn hiểu rõ khái niệm, cú pháp, cách sử dụng và các ví dụ thực tế liên quan đến hàm filter().
Hàm filter() trong Python là gì?
Hàm filter() trong Python là một hàm dựng sẵn (built-in) được sử dụng để lọc các phần tử trong một iterable (như list, tuple, set,…) dựa trên một điều kiện xác định trước. Cụ thể, hàm này sẽ nhận vào một hàm kiểm tra (function) và một iterable, sau đó lần lượt áp dụng điều kiện lên từng phần tử để giữ lại những giá trị thỏa mãn yêu cầu.
Công dụng chính của hàm filter trong Python là giúp rút gọn quá trình xử lý dữ liệu, thay thế cho việc phải viết các vòng lặp kết hợp với câu lệnh điều kiện. Nhờ đó, mã nguồn trở nên ngắn gọn, dễ đọc và có tính biểu đạt cao hơn. Đồng thời, hàm filter() cũng hỗ trợ làm việc hiệu quả với các cấu trúc dữ liệu lớn, đặc biệt khi kết hợp với các hàm khác trong lập trình hàm (functional programming).
Cú pháp của hàm filter() trong Python
Để sử dụng hiệu quả hàm filter trong Python, bạn cần nắm rõ cách khai báo và cấu trúc cú pháp của hàm này. Việc hiểu đúng cú pháp sẽ giúp bạn áp dụng filter() linh hoạt hơn trong nhiều tình huống xử lý dữ liệu khác nhau.
Cú pháp khai báo hàm filter()
Cú pháp khai báo của hàm filter() trong Python được viết như sau:
|
filter(function, iterable) |
Ý nghĩa các tham số trong hàm filter()
Trong hàm filter trong Python, mỗi tham số đều đóng vai trò quan trọng trong việc xác định cách thức lọc dữ liệu. Cụ thể như sau:
- function: Là hàm dùng để kiểm tra điều kiện đối với từng phần tử trong iterable. Hàm này phải trả về giá trị boolean (True hoặc False), trong đó True nghĩa là phần tử được giữ lại, còn False sẽ bị loại bỏ. Tham số này có thể là một hàm tự định nghĩa hoặc biểu thức lambda.
- iterable: Là tập hợp dữ liệu đầu vào cần được lọc, có thể là list, tuple, set, string hoặc bất kỳ đối tượng nào có thể lặp (iterable). Hàm filter() sẽ duyệt qua từng phần tử trong iterable và áp dụng function để xác định phần tử nào thỏa mãn điều kiện.
Giá trị trả về từ hàm filter()
Giá trị trả về của hàm filter() trong Python là một đối tượng thuộc kiểu filter object (bộ lọc). Đây là một iterable chứa các phần tử đã được chọn lọc dựa trên điều kiện của hàm function, nhưng không phải là một danh sách (list) cụ thể.
Một số đặc điểm quan trọng của giá trị trả về từ hàm filter():
- Là iterable: Bạn có thể duyệt qua bằng vòng lặp hoặc chuyển đổi sang các kiểu dữ liệu khác như list, tuple để sử dụng thuận tiện hơn.
- Không hiển thị trực tiếp nội dung: Khi in ra, filter object chỉ hiển thị dạng đại diện bộ nhớ, vì vậy cần ép kiểu (ví dụ: list()) để xem kết quả.
- Tiết kiệm bộ nhớ: Dữ liệu được xử lý theo kiểu lazy (trì hoãn), nghĩa là các phần tử chỉ được tạo ra khi cần, giúp tối ưu hiệu suất khi làm việc với tập dữ liệu lớn.
Các cách sử dụng hàm filter() trong Python (kèm ví dụ)
Sau khi nắm được cú pháp, bạn cần hiểu cách áp dụng hàm filter trong Python vào từng trường hợp cụ thể để đạt hiệu quả tối ưu. Tùy vào mục đích xử lý dữ liệu, bạn có thể kết hợp filter() với nhiều kiểu dữ liệu và cách viết hàm khác nhau.
Dùng filter() với các iterable (list, tuple, set, string,…)
Hàm filter() trong Python có thể áp dụng trực tiếp lên nhiều kiểu dữ liệu iterable như list, tuple, set hay string. Khi sử dụng, hàm sẽ duyệt qua từng phần tử trong iterable và giữ lại những giá trị thỏa mãn điều kiện được định nghĩa trong function, từ đó giúp bạn lọc dữ liệu một cách nhanh chóng và gọn gàng.
Ví dụ: Lọc các số chẵn từ một danh sách (list)
|
numbers = [1, 2, 3, 4, 5, 6] def is_even(n): return n % 2 == 0 result = filter(is_even, numbers) print(list(result)) # Output: [2, 4, 6] |
Ví dụ: Lọc các ký tự là chữ cái trong một chuỗi (string)
|
text = “Python123” def is_alpha(char): return char.isalpha() result = filter(is_alpha, text) print(list(result)) # Output: [‘P’, ‘y’, ‘t’, ‘h’, ‘o’, ‘n’] |
Ví dụ: Lọc các phần tử lớn hơn 10 trong một tập hợp (set)
|
data = {5, 10, 15, 20} result = filter(lambda x: x > 10, data) print(list(result)) # Output: [15, 20] |
Như vậy, filter() có thể linh hoạt làm việc với nhiều loại iterable khác nhau, giúp bạn xử lý và chọn lọc dữ liệu một cách hiệu quả mà không cần sử dụng vòng lặp phức tạp.
Dùng filter() với hàm tự định nghĩa
Khi sử dụng filter() với hàm tự định nghĩa, bạn sẽ tạo một hàm riêng để mô tả điều kiện lọc, sau đó truyền hàm này vào filter() để áp dụng lên từng phần tử trong iterable. Cách làm này giúp bạn kiểm soát logic rõ ràng hơn, đặc biệt khi điều kiện lọc phức tạp và cần tái sử dụng nhiều lần trong chương trình.
Ví dụ: Lọc các số lớn hơn 10 từ một danh sách
|
numbers = [5, 12, 8, 20, 3, 15] def greater_than_10(n): return n > 10 result = filter(greater_than_10, numbers) print(list(result)) # Output: [12, 20, 15] |
Ví dụ: Lọc các chuỗi có độ dài lớn hơn 5 ký tự
|
words = [“apple”, “banana”, “cat”, “elephant”, “dog”] def long_word(word): return len(word) > 5 result = filter(long_word, words) print(list(result)) # Output: [‘banana’, ‘elephant’] |
Việc sử dụng hàm tự định nghĩa với filter() không chỉ giúp mã nguồn dễ đọc, dễ bảo trì mà còn phù hợp trong các bài toán cần xử lý dữ liệu theo điều kiện phức tạp hoặc mang tính tùy biến cao.
Dùng filter() với lambda
Sử dụng filter() với lambda là cách viết ngắn gọn và linh hoạt khi bạn không cần định nghĩa một hàm riêng biệt. Thay vì tạo hàm bằng def, bạn có thể dùng biểu thức lambda (hàm ẩn danh) để mô tả trực tiếp điều kiện lọc ngay trong lời gọi filter(), giúp mã nguồn súc tích và dễ triển khai trong các trường hợp đơn giản.
Ví dụ: Lọc các số lẻ từ danh sách
|
numbers = [1, 2, 3, 4, 5, 6] result = filter(lambda x: x % 2 != 0, numbers) print(list(result)) # Output: [1, 3, 5] |
Ví dụ: Lọc các chuỗi có độ dài lớn hơn 3 ký tự
|
words = [“hi”, “hello”, “cat”, “python”, “go”] result = filter(lambda word: len(word) > 3, words) print(list(result)) # Output: [‘hello’, ‘python’] |
Việc kết hợp filter() với lambda đặc biệt phù hợp trong những tình huống xử lý nhanh, giúp giảm số dòng code và tăng tính trực quan, tuy nhiên với các điều kiện phức tạp, bạn vẫn nên ưu tiên dùng hàm tự định nghĩa để đảm bảo tính rõ ràng.
Dùng filter() với giá trị None
Khi sử dụng filter() với giá trị None, Python sẽ tự động loại bỏ các phần tử có giá trị “falsy” (giá trị được xem là sai) trong iterable mà không cần truyền vào một hàm điều kiện cụ thể. Các giá trị falsy thường bao gồm: 0, False, None, chuỗi rỗng (“”), danh sách rỗng ([]), tuple rỗng (()),…
Cách dùng này rất hữu ích khi bạn chỉ cần loại bỏ các phần tử rỗng hoặc không hợp lệ một cách nhanh chóng, giúp mã nguồn trở nên ngắn gọn và dễ hiểu hơn.
Ví dụ: Lọc bỏ các giá trị falsy trong danh sách
|
data = [0, 1, False, 2, “”, 3, None, 4] result = filter(None, data) print(list(result)) # Output: [1, 2, 3, 4] |
Ví dụ: Lọc bỏ các chuỗi rỗng trong danh sách
|
words = [“Python”, “”, “Code”, None, “AI”, “”] result = filter(None, words) print(list(result)) # Output: [‘Python’, ‘Code’, ‘AI’] |
Như vậy, khi truyền None vào filter(), Python sẽ ngầm hiểu rằng bạn muốn giữ lại những phần tử có giá trị “đúng” (truthy), từ đó giúp việc làm sạch dữ liệu trở nên đơn giản và hiệu quả hơn.
Dùng filter() với object phức tạp (dict, class)
Trong thực tế, filter() không chỉ dùng với các kiểu dữ liệu đơn giản mà còn có thể áp dụng hiệu quả với các object phức tạp như dictionary (dict) hoặc các đối tượng từ class. Khi đó, bạn sẽ xây dựng điều kiện lọc dựa trên thuộc tính hoặc giá trị bên trong từng object, giúp xử lý dữ liệu có cấu trúc một cách linh hoạt và rõ ràng hơn.
Ví dụ: Lọc các dictionary có giá trị lớn hơn một ngưỡng
|
students = [ {“name”: “An”, “score”: 7}, {“name”: “Binh”, “score”: 5}, {“name”: “Chi”, “score”: 8} ] result = filter(lambda s: s[“score”] >= 7, students) print(list(result)) # Output: [{‘name’: ‘An’, ‘score’: 7}, {‘name’: ‘Chi’, ‘score’: 8}] |
Ví dụ: Lọc các object từ class theo điều kiện
|
class Student: def __init__(self, name, score): self.name = name self.score = score students = [ Student(“An”, 7), Student(“Binh”, 5), Student(“Chi”, 8) ] result = filter(lambda s: s.score >= 7, students) # In kết quả for student in result: print(student.name, student.score) # Output: # An 7 # Chi 8 |
Nhờ khả năng làm việc với object phức tạp, filter() trở thành công cụ mạnh mẽ trong việc xử lý dữ liệu thực tế, đặc biệt khi bạn làm việc với danh sách đối tượng hoặc dữ liệu dạng JSON trong các ứng dụng Python.
Dùng filter() kết hợp với các hàm khác (map(), sorted(),…)
Trong nhiều tình huống thực tế, filter() thường được kết hợp với các hàm khác như map(), sorted() để tạo thành chuỗi xử lý dữ liệu linh hoạt theo phong cách lập trình hàm (functional programming). Việc kết hợp này giúp bạn vừa lọc, vừa biến đổi và sắp xếp dữ liệu chỉ trong vài dòng code ngắn gọn, từ đó tối ưu hiệu suất và tăng tính biểu đạt của chương trình.
Ví dụ: Kết hợp filter() và map() để lọc số chẵn và bình phương chúng
|
numbers = [1, 2, 3, 4, 5, 6] result = map(lambda x: x**2, filter(lambda x: x % 2 == 0, numbers)) print(list(result)) # Output: [4, 16, 36] |
Ví dụ: Kết hợp filter() và sorted() để lọc và sắp xếp dữ liệu
|
data = [5, 12, 3, 20, 8, 15] # Lọc các số lớn hơn 10 rồi sắp xếp tăng dần result = sorted(filter(lambda x: x > 10, data)) print(result) # Output: [12, 15, 20] |
Ví dụ: Kết hợp nhiều hàm để xử lý dữ liệu phức tạp
|
words = [“apple”, “banana”, “cat”, “elephant”, “dog”] # Lọc các từ dài hơn 3 ký tự, sau đó chuyển thành chữ in hoa result = map(lambda w: w.upper(), filter(lambda w: len(w) > 3, words)) print(list(result)) # Output: [‘APPLE’, ‘BANANA’, ‘ELEPHANT’] |
Việc kết hợp filter() với các hàm khác không chỉ giúp rút gọn code mà còn thể hiện rõ luồng xử lý dữ liệu, rất phù hợp trong các bài toán cần thao tác nhiều bước liên tiếp trên cùng một tập dữ liệu.
So sánh hàm Python filter vs list comprehension
Khi làm việc với dữ liệu, bên cạnh hàm filter trong Python, list comprehension cũng là một cách phổ biến để lọc và xử lý phần tử trong iterable. Việc so sánh hai phương pháp này sẽ giúp bạn lựa chọn cách viết phù hợp hơn trong từng trường hợp cụ thể.
Điểm giống nhau
Cả hàm filter trong Python và list comprehension đều được sử dụng để xử lý và lọc dữ liệu trong các iterable, vì vậy chúng có nhiều điểm tương đồng trong cách hoạt động và mục đích sử dụng.
- Đều dùng để lọc dữ liệu: Cả hai đều cho phép bạn chọn ra các phần tử thỏa mãn một điều kiện nhất định từ list, tuple, hoặc các iterable khác.
- Áp dụng điều kiện lên từng phần tử: Mỗi phần tử trong iterable đều được kiểm tra thông qua một biểu thức điều kiện để quyết định có được giữ lại hay không.
- Giúp rút gọn code: So với việc dùng vòng lặp for kết hợp if, cả filter() và list comprehension đều giúp viết code ngắn gọn và dễ đọc hơn.
- Có thể kết hợp với các thao tác khác: Cả hai đều có thể sử dụng cùng các hàm hoặc logic khác để xử lý dữ liệu linh hoạt hơn trong cùng một dòng lệnh.
Điểm khác nhau
Mặc dù hàm filter trong Python và list comprehension có nhiều điểm tương đồng, nhưng chúng vẫn tồn tại những khác biệt rõ ràng về cú pháp, cách sử dụng và hiệu quả trong từng tình huống cụ thể. Việc hiểu rõ những điểm khác nhau này sẽ giúp bạn lựa chọn phương pháp phù hợp hơn khi viết code.
| Tiêu chí | filter() | list comprehension |
| Cú pháp | Sử dụng hàm: filter(function, iterable) | Dạng biểu thức: [expression for item in iterable if condition] |
| Cách viết điều kiện | Điều kiện nằm trong function (hoặc lambda) | Điều kiện viết trực tiếp trong biểu thức |
| Khả năng đọc hiểu | Có thể khó hiểu với người mới (đặc biệt khi dùng lambda) | Dễ đọc, trực quan hơn |
| Giá trị trả về | Trả về filter object (cần ép kiểu về list nếu cần) | Trả về list ngay lập tức |
| Hiệu suất | Tiết kiệm bộ nhớ (lazy evaluation) | Tạo list ngay (tốn bộ nhớ hơn) |
| Tính linh hoạt | Phù hợp khi tái sử dụng function | Linh hoạt hơn khi viết nhanh, xử lý đơn giản |
Ví dụ so sánh: Lọc số chẵn từ danh sách
Sử dụng filter():
|
numbers = [1, 2, 3, 4, 5, 6] result = filter(lambda x: x % 2 == 0, numbers) print(list(result)) # Output: [2, 4, 6] |
Sử dụng list comprehension:
|
numbers = [1, 2, 3, 4, 5, 6] result = [x for x in numbers if x % 2 == 0] print(result) # Output: [2, 4, 6] |
Qua bảng so sánh và ví dụ trên, có thể thấy filter() phù hợp khi bạn muốn tối ưu bộ nhớ hoặc tái sử dụng hàm, trong khi list comprehension lại là lựa chọn tốt hơn nếu bạn ưu tiên sự rõ ràng và dễ đọc trong code.
Một số lưu ý khi dùng hàm filter() trong Python
Khi sử dụng hàm filter() trong Python, bạn cần nắm rõ một số đặc điểm quan trọng để tránh sai sót và tối ưu hiệu quả xử lý dữ liệu. Những lưu ý dưới đây sẽ giúp bạn áp dụng filter() đúng cách và phù hợp hơn trong từng tình huống cụ thể.
- Giá trị trả về là filter object: Kết quả của filter() không phải là list mà là một iterable, vì vậy bạn cần chuyển đổi bằng list() hoặc tuple() nếu muốn sử dụng trực tiếp.
- Chỉ nên dùng cho điều kiện đơn giản: Với các điều kiện lọc ngắn gọn, filter() (đặc biệt khi kết hợp lambda) sẽ rất tiện lợi. Tuy nhiên, nếu điều kiện phức tạp, bạn nên dùng hàm tự định nghĩa hoặc list comprehension để code dễ đọc hơn.
- Không làm thay đổi iterable ban đầu: Hàm filter() chỉ tạo ra một iterable mới chứa các phần tử thỏa mãn điều kiện, không ảnh hưởng đến dữ liệu gốc.
- Có thể dùng với nhiều loại iterable: filter() hoạt động tốt với list, tuple, set, string hoặc bất kỳ đối tượng nào có thể lặp.
- Chú ý khi dùng với None: Khi truyền None làm function, filter() sẽ tự động loại bỏ các giá trị falsy như 0, False, None, chuỗi rỗng,… điều này đôi khi có thể gây nhầm lẫn nếu bạn không kiểm soát dữ liệu đầu vào.
- Nên cân nhắc giữa filter() và list comprehension: Trong nhiều trường hợp, list comprehension sẽ dễ đọc hơn, đặc biệt khi làm việc nhóm hoặc viết code cần tính rõ ràng cao.
Những lỗi thường gặp với lệnh filter() trong Python
Trong quá trình sử dụng hàm filter() trong Python, người mới học thường gặp phải một số lỗi phổ biến do hiểu chưa đúng cách hoạt động hoặc cú pháp của hàm. Việc nhận diện sớm những lỗi này sẽ giúp bạn tránh được sai sót và viết code chính xác hơn.
- Truyền sai kiểu đối số cho function: Hàm được truyền vào filter() phải nhận đúng một tham số tương ứng với từng phần tử của iterable. Nếu định nghĩa sai số lượng tham số, chương trình sẽ báo lỗi.
- Nhầm lẫn giữa điều kiện và giá trị trả về: Function trong filter() cần trả về giá trị boolean (True/False). Nếu bạn vô tình trả về giá trị khác (ví dụ số hoặc chuỗi), kết quả có thể không đúng như mong muốn.
- Quên chuyển đổi kết quả khi cần sử dụng: Vì filter() trả về một iterable dạng filter object, nếu bạn cố gắng thao tác như list (ví dụ truy cập phần tử bằng index) mà chưa ép kiểu, sẽ dẫn đến lỗi.
- Dùng lambda quá phức tạp: Việc nhồi nhiều điều kiện vào một biểu thức lambda có thể khiến code khó đọc, dễ sai logic và khó debug.
- Hiểu sai về phạm vi biến (scope): Khi dùng filter() với lambda hoặc function, nếu bạn tham chiếu đến biến bên ngoài không đúng cách, có thể dẫn đến kết quả sai hoặc lỗi không mong muốn.
- Không xử lý dữ liệu không đồng nhất: Nếu iterable chứa nhiều kiểu dữ liệu khác nhau (ví dụ vừa số, vừa chuỗi), function có thể gây lỗi khi áp dụng cùng một điều kiện cho tất cả phần tử.
Câu hỏi thường gặp về hàm filter() Python
Hàm filter() có thay đổi list gốc không?
Không, hàm filter() trong Python không làm thay đổi list gốc. Thay vào đó, nó tạo ra một iterable mới chứa các phần tử thỏa mãn điều kiện, trong khi dữ liệu ban đầu vẫn được giữ nguyên.
Dùng filter() có nhanh hơn vòng lặp for() không?
Trong nhiều trường hợp, filter() có thể nhanh hơn vòng lặp for() nhờ được tối ưu sẵn ở mức nội bộ của Python. Tuy nhiên, sự chênh lệch hiệu suất thường không đáng kể, vì vậy bạn nên ưu tiên cách viết rõ ràng, dễ hiểu thay vì chỉ tập trung vào tốc độ.
Hàm filter() khác gì map() trong Python?
Sự khác biệt chính là filter() dùng để lọc dữ liệu, chỉ giữ lại các phần tử thỏa mãn điều kiện, trong khi map() dùng để biến đổi dữ liệu, áp dụng một hàm lên toàn bộ phần tử trong iterable để tạo ra giá trị mới.
filter() có dùng được với mọi iterable không?
Có, lệnh filter() có thể sử dụng với hầu hết mọi iterable trong Python như list, tuple, set, string hoặc các đối tượng có thể lặp khác. Miễn là dữ liệu có thể duyệt qua từng phần tử, filter() đều có thể áp dụng để lọc theo điều kiện.
Qua những nội dung trên, bạn đã hiểu rõ khái niệm, cú pháp, cách sử dụng cũng như các tình huống ứng dụng thực tế của hàm filter trong Python trong xử lý dữ liệu. Đây là một công cụ hữu ích giúp bạn viết code ngắn gọn, tối ưu và mang tính biểu đạt cao hơn khi làm việc với iterable. Hy vọng bài viết này sẽ giúp bạn tự tin áp dụng filter() vào các bài toán lập trình một cách hiệu quả.
🔗 Xem Thêm:
- Hàm Float Trong Python Là Gì? Cú Pháp, Cách Dùng & Ví Dụ Minh Họa
- Hàm Range Trong Python: Cú Pháp, Cách Dùng, Ví Dụ & Bài Tập Vận Dụng
- Lệnh Return Trong Python Là Gì? Vai Trò, Cú Pháp, Cách Dùng & Ví Dụ Thực Tế
- Hàm Split Trong Python Là Gì? Cú Pháp, Cách Dùng & Ví Dụ Thực Tế
- Lệnh Print() Trong Python Là Gì? Cú Pháp, Cách Dùng & Ví Dụ Thực Tế
- Top 30 Các Python Frameworks Tốt Nhất Cho Mọi Nhu Cầu Lập Trình [2026]

