2015-01-09 15 views
5

Cách thành ngữ nhất để viết một số filter với từ khóa là gì?Tự động phủ nhận một bộ lọc

Ví dụ:

is_even= lambda x : x % 2 == 0 
odd_numbers= filter(lambda x: not is_even(x), range(10)) 

Tất nhiên, bạn chỉ có thể sử dụng danh sách comprehensions - nhưng sau đó bạn không cần phải sử dụng filter nào

Trong trường hợp ai thắc mắc, tôi đã tình cờ gặp trong khi điều này cố gắng split a list based on a condition

+0

Trong trường hợp bất kỳ ai thắc mắc, tôi đang cố gắng [chia danh sách dựa trên điều kiện] (https://stackoverflow.com/questions/949098/python- split-a-list-on-a-condition) – goncalopp

+0

Đó là missin ')' một lỗi đánh máy? –

+0

@BhargavRao yes – goncalopp

Trả lời

5

Module itertools bao gồm cả ifilter()ifilterfalse(), mà phần của bộ lọc mà hàm trả về True và 0.123.tương ứng.

odd_numbers = ifilterfalse(is_even, range(10)) 

Lưu ý rằng, trong Python 2, có sự khác biệt giữa filterifilter: odd_numbers đây sẽ là một iterator, trong khi bộ lọc() sẽ cung cấp một danh sách (xem itertools.ifilter Vs. filter Vs. list comprehensions). Nếu bạn thực sự muốn tạo danh sách, ví dụ của bạn với not có vẻ ổn, giả sử bạn được đặt sử dụng filter - việc hiểu danh sách có thể có nhiều 'thành ngữ' hơn (List filtering: list comprehension vs. lambda + filter).

Trong Python 3, filter() xây dựng một trình lặp, không phải danh sách và itertools.filterfalse() là phần bổ sung.

1

Tách dựa trên vị từ được gọi là partition. Tôi sẽ tìm thấy nó thành ngữ hơn để thực hiện partition như là một chức năng riêng biệt hơn là lặp lại nội bộ của nó đặc biệt cho số lẻ và thậm chí. Python 3 của Itertools Recipes có việc thực hiện sau đây:

def partition(pred, iterable): 
    'Use a predicate to partition entries into false entries and true entries' 
    # partition(is_odd, range(10)) --> 0 2 4 6 8 and 1 3 5 7 9 
    t1, t2 = tee(iterable) 
    return filterfalse(pred, t1), filter(pred, t2) 

Nó sử dụng filterfalse (như mô tả của @Lack) và tee quy định tại mô-đun đó. Vì vậy, mã cấp cao nhất của bạn sẽ trông giống như:

odds, evens = partition(is_even, range(10)) 
+0

Vâng, đây là giải pháp tốt hơn cho vấn đề thực tế nếu bạn đang sử dụng cả hai phần của danh sách. – Lack

+0

Đây có lẽ là giá trị đăng trong câu hỏi tôi liên kết đến, như không ai đề cập đến nó được nêu ra. Câu hỏi của tôi đặc biệt được thúc đẩy bởi sự tò mò hơn là nhu cầu thực tế để giải quyết sự phân vùng thực tế (đã có rất nhiều câu trả lời) – goncalopp

Các vấn đề liên quan