2011-07-20 50 views
10

是否可以在過濾器中使用python關鍵字in?我知道二元一元賦值操作相當於函數調用。python`in`關鍵字作爲過濾器中使用的函數

''!=3 

相同

''.__ne__(3) 

是那裏的in功能類似的事情嗎? 我想做這樣的事情。 ..

filter(list1.__in__, list2) 

我想這可以在功能編寫完成......但我只是想知道,如果它已經內置與否。

回答

8

您正在尋找__contains__

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

而對於你想做的事:

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

更乾淨寫爲:

[ v for v in list2 if v in list1 ] 

和等效性:

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

一般而言,您應該使用operator模塊的功能,在這種情況下,它應該是operator.contains

但還有更有效的方式使用集來做到這一點:

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] 

注:&運算符是交集。

+2

使用集不會維護元素的順序。 –

2

在Dan D.的答案中,列表理解無疑是最好的方法。在更普遍的情況下,雖然,你想要在這需要另一個函數作爲參數的函數使用類似innot,你可以使用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] 

同樣,我提出這只是你的一般知識;處理這個特定案例的最佳方式肯定是列表理解,就像Dan D.的答案一樣。有關Python中lambdas的更多信息,請參閱here

+0

您應該使用'operator'模塊的函數,因爲它們速度更快。 – schlamar

+1

@ ms4py:我認爲在大多數情況下,使用運算符模塊的好處在於提高了可讀性和易用性。在知道需要性能提升後,我只會使用'operator'模塊。 –

相關問題