2010-03-03 38 views
6

我需要一個函數,它能夠遍歷集合,以收集的元素作爲參數調用提供的函數,並在從提供的函數接收到「True」時返回參數或其索引。Python - 功能性「查找」?

據somethong這樣的:

def find(f, seq, index_only=True, item_only=False): 
    """Return first item in sequence where f(item) == True.""" 
    index = 0 
    for item in seq: 
     if f(item): 
      if index_only: 
       return index 
      if item_only: 
       return item 
      return index, item 
     index+= 1 
    raise KeyError 

所以我想知道是否有像在非標準蟒蛇工具集什麼?

+2

該OP的片段是更直接(如果只是更長一點)的方式來表達的要求;這可能是規定的方式,取決於具體情況。然而,從答覆中得出一個非常有用的見解:「關於循環,如有疑問,請諮詢/考慮itertools'。 – mjv 2010-03-03 14:43:51

回答

2

您可以使用itertools.dropwhile跳過提供的函數返回False的項目,然後取其餘項的第一項(如果有的話)。如果您需要索引而不是項目,請將itertools docs的食譜部分中的enumerate合併。

要反轉由所提供的函數返回真值,則使用一個lambdalambda x: not pred (x),其中pred是所提供的功能)或命名包裝:

def negate(f): 
    def wrapped(x): 
     return not f(x) 
    return wrapped 

實施例:

def odd(x): return x % 2 == 1 
itertools.dropwhile(negate(odd), [2,4,1]).next() 
# => 1 

這將如果找不到匹配項目,則拋出StopIteration;將其封裝在您自己的功能中,以代替您的選擇。

+0

:(我覺得OP的問題本身就是答案,這可能是多一點簡單的迭代 – 2010-03-03 14:32:41

+0

我同意阿努拉格,但如果'itertools'使用我想'ifilter'會更簡單 例:'itertools.ifilter (奇數,[2,4,1])。next()' – tgray 2010-03-03 17:26:47

+0

我傾向於同意'ifilter'。此外,OP的代碼段確實解決了基本問題,但仍然不知道標準庫幫助避免爲這樣的東西編寫代碼似乎很合理。我想說mjv對這個問題的評論總結了這裏的重要教訓。 – 2010-03-03 19:50:22

3

我不認爲有這樣的精確語義任何這樣的功能,反正你的函數是短暫的,不夠好,你可以很容易地改進以備後用,所以用它。

因爲簡單比複雜更好。