在Python中,我有以下功能:如何爲Python itertools.ifilter函數提供額外的參數?
def is_a_nice_element(element, parameter):
#do something
return True or False
現在我想過濾列表,使用此功能作謂語,給出一個固定的參數。 Python有itertools.ifilter函數,但我不知道如何傳遞參數。這可能嗎?如果不是,我該如何解決這個問題?
在Python中,我有以下功能:如何爲Python itertools.ifilter函數提供額外的參數?
def is_a_nice_element(element, parameter):
#do something
return True or False
現在我想過濾列表,使用此功能作謂語,給出一個固定的參數。 Python有itertools.ifilter函數,但我不知道如何傳遞參數。這可能嗎?如果不是,我該如何解決這個問題?
把它包在一個lambda
:
itertools.ifilter(lambda e: is_a_nice_element(e, 42), iterable)
42是你的額外的參數,或者其他任何你希望它是。
如果您使用的是ifilter
,則參數需要保持不變,在這種情況下,您可以使用默認參數parameter=something
。如果你想讓參數變化,你需要使用另一種方法來進行二元謂詞。
如果您已經擁有清單,ifilter
相對於內置的filter有點矯枉過正。
描述你想要完成什麼將有助於做出更具體的答案。
對不起,但我需要在這裏給出這個參數。如果我不需要參數,那麼我不會有問題。 – 2010-03-20 13:40:55
我喜歡functools.partial比lambda
好得多。
itertools.ifilter(partial(is_a_nice_element, parameter=X), iterable)
+1使用'偏',雖然你沒有解釋爲什麼你更喜歡它。 – amotzg 2013-10-21 11:50:04
該解決方案使用lambda
和functools.partial
是十分正確的,直接回答你的問題,但我不認爲他們是真正理想的解決方案。
使用filter
/itertools.ifilter
/map
/itertools.imap
與匿名功能prettymuch總是會比使用生成的表達或列表理解不太清楚。例如,在這種情況下,我會寫發電機表達
(item for item in iterable if is_a_nice_element(item, constant))
代替使用ifilter
。在這種情況下,ifilter
解決方案仍然具有相當的可讀性,但在許多情況下,嘗試經歷許多麻煩來定義正確的功能並不像僅僅執行操作一樣有價值。
這樣做的一個缺點是您無法參數化過濾器。 EG,如果你想在像'def find_nice_elements(filter_function = partial(is_nice,p = 42))這樣的函數內做這個過濾:...' – intuited 2010-06-21 03:04:41
謝謝,這是我真正需要的! – 2010-03-20 13:39:10