2011-07-20 20 views
10

là có thể sử dụng từ khóa python in trong bộ lọc không? Tôi biết rằng các phép toán nhị phân, unary, gán tương đương với một lời gọi hàm.python `in` từ khóa dưới dạng hàm được sử dụng trong bộ lọc

như

''!=3 

cũng giống như

''.__ne__(3) 

là có một điều tương tự cho in chức năng? Tôi muốn làm một cái gì đó như thế này. ..

filter(list1.__in__, list2) 

Tôi đoán điều này có thể được thực hiện bằng cách viết chức năng ... nhưng tôi chỉ muốn biết nếu nó đã được tích hợp sẵn hay chưa.

Trả lời

8

Bạn đang tìm kiếm __contains__.

>>> [1, 2, 3].__contains__(2) 
True 
>>> [1, 2, 3].__contains__(4) 
False 

Và đối với những gì bạn muốn làm:

>>> list1 = [2, 4, 6, 8, 10] 
>>> filter(list1.__contains__, [1, 2, 3, 4, 5]) 
[2, 4] 
15
filter(list1.__contains__, list2) 

được sạch hơn viết như sau:

[ v for v in list2 if v in list1 ] 

và để hiển thị tương đương:

>>> list1 = [2, 4, 6, 8, 10] 
>>> list2 = [1, 2, 3, 4, 5] 
>>> [ v for v in list2 if v in list1 ] 
[2, 4] 
4

Nói chung, bạn nên sử dụng các chức năng từ mô-đun operator, trong trường hợp này nó sẽ là operator.contains.

Nhưng hiệu quả hơn có cách để làm điều này bằng cách sử dụng bộ:

In [1]: list1 = [2, 4, 6, 8, 10] 

In [2]: list2 = [1, 2, 3, 4, 5] 

In [3]: list(set(list1) & set(list2)) 
Out[3]: [2, 4] 

Lưu ý: Các nhà điều hành & là giao lộ.

+2

Sử dụng bộ không duy trì thứ tự của các phần tử. –

2

Việc hiểu danh sách, như trong câu trả lời của Dan D., chắc chắn là cách tốt nhất để làm điều này. Trong trường hợp tổng quát hơn, tuy nhiên, nơi bạn muốn sử dụng cái gì đó như in hoặc not trong một chức năng trong đó có chức năng khác như một cuộc tranh cãi, bạn có thể sử dụng một hàm lambda:

>>> list1 = [2, 4, 6, 8, 10] 
>>> list2 = [1, 2, 3, 4, 5] 
>>> in_check = lambda item: item in list1 
>>> filter(in_check, list2) 
[2, 4] 

Một lần nữa, tôi trình bày này chỉ dành riêng cho kiến thức chung của bạn; cách tốt nhất để xử lý trường hợp cụ thể này chắc chắn là với việc hiểu danh sách, như trong câu trả lời của Dan D. Thông tin thêm về lambdas trong Python có sẵn here.

+0

Bạn nên sử dụng các hàm từ mô-đun 'toán tử' vì chúng nhanh hơn nhiều. – schlamar

+1

@ ms4py: Tôi cho rằng trong trường hợp _most_ sau đó tăng cường khả năng đọc và dễ sử dụng của 'x trong y' lớn hơn lợi ích của việc sử dụng mô-đun điều hành. Tôi sẽ chỉ sử dụng module 'operator' sau khi tôi biết tôi cần tăng hiệu năng. –

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