是否可以在過濾器中使用python關鍵字in
?我知道二元一元賦值操作相當於函數調用。python`in`關鍵字作爲過濾器中使用的函數
如
''!=3
相同
''.__ne__(3)
是那裏的in
功能類似的事情嗎? 我想做這樣的事情。 ..
filter(list1.__in__, list2)
我想這可以在功能編寫完成......但我只是想知道,如果它已經內置與否。
是否可以在過濾器中使用python關鍵字in
?我知道二元一元賦值操作相當於函數調用。python`in`關鍵字作爲過濾器中使用的函數
如
''!=3
相同
''.__ne__(3)
是那裏的in
功能類似的事情嗎? 我想做這樣的事情。 ..
filter(list1.__in__, list2)
我想這可以在功能編寫完成......但我只是想知道,如果它已經內置與否。
您正在尋找__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]
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]
一般而言,您應該使用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]
注:&
運算符是交集。
在Dan D.的答案中,列表理解無疑是最好的方法。在更普遍的情況下,雖然,你想要在這需要另一個函數作爲參數的函數使用類似in
或not
,你可以使用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。
您應該使用'operator'模塊的函數,因爲它們速度更快。 – schlamar
@ ms4py:我認爲在大多數情況下,使用運算符模塊的好處在於提高了可讀性和易用性。在知道需要性能提升後,我只會使用'operator'模塊。 –
使用集不會維護元素的順序。 –