2012-11-09 40 views
1

在Python 2.7.x我有兩份名單,我想返回如下圖所示Python的轉換嵌套的循環,以簡單的線條

def first_incorrect_term(polynomial, terms): 
    for index in range(len(polynomial), len(terms)): 
     if evaluate(polynomial, index) != terms[index-1]: 
      return evaluate(polynomial, index) 

讓我們假設評估的第一個值(不是指數)的功能是功能這樣可行。我想用這些看起來面向對象的三行替換成使用Python中的「find」或某些這樣的函數的東西。

基本上我通過超越多項式的數居第二列表的指數迭代(因爲我相信第一個X項將匹配),評估,並與預期項比較。對於術語不匹配的第一個例子,我希望返回的評估多項式。

我要尋找一個替代使用Python的發現/λ或一些這樣的事情,這些三線的,這是因爲我可以肯定看到我不使用Python的權力作爲link

中描述PS:這是一定的相關項目歐拉的問題,但是我一直在使用上面的代碼片段解決了它,並想提高我的「巨蟒」的技能:)

+4

'有效範圍內的索引(LEN(多項式),LEN(術語))'不會迭代多項式的索引,但在超出多項式的端部而言的索引(聚爲5個元素,術語是7種元素給出'範圍(5,7)= [5,6]');這不符合你對'遍歷第一個列表的索引'的描述。 –

+0

關於你真正想要的東西;你在尋找可以迭代的東西嗎? –

+0

你是對的讓我編輯它 –

回答

1

首先,使用yield,使你的函數發生器版本:

def incorrect_terms(polynomial, terms): 
    for index in range(len(polynomial), len(terms)): 
     eval = evaluate(polynomial,index) 
     if eval != terms[index-1]: 
      yield (polynomial, index, eval) 

然後第一個結果是第一個不匹配:

mismatches = incorrect_terms(polynomial, terms) 
first_mismatch = mismatches.next() 

我想到你居然想通過迭代條件的所有值,沒有多項式的長度後的值,在這種情況下,您可以壓縮:

results = (evaluate(polynomial,index) for index in count(0)) 
pairsToCompare = itertools.izip(results, terms) 
mismatches = (pair for pair in pairsToCompare if pair[0] != pair[1]) 

first_mismatch = mismatches.next() 

這裏假設evaluate(polynomial, n)是calculati給定多項式的第n項,並將它們與terms中的值進行比較。

+0

菲爾我絕對想從一個點而不是零評估,因爲評估不是一個微不足道的功能,而且有點貴。我也不想計算所有的評估,因爲N增加了評估增加的時間。所以,我寧願在最早可奧珀蒂尼蒂 –

+0

@CalmStorm停止:這裏顯示的所有方法都懶洋洋地評估,這是他們唯一的評估值一次一個 - 直到它izip不評估爲ZIP接下來的事情要求。關於從零開始的評估:我只能猜測「評估」功能;似乎你似乎正在評估多項式中的項並比較它們。在這種情況下,我希望您需要比較所有條款,從第一條,但在發現差異時停止。如果不是這樣,請使用第一個版本。 –

+0

這個問題在這方面也非常有用http://stackoverflow.com/questions/8534256/python-find-first-element-in-a-sequence-that-matches-a-predicate –

0

我會用生成器表達式做到這一點,但他們沒有適合在一條線,以及:

def first_incorrect_term(polynomial, terms): 
    evaled = ((index, evaluate(polynomial, index)) for index in range(len(polynomial), len(terms))) 
    return next((val for index, val in evaled if val != terms[index-1]), None)