2016-10-04 78 views
0

我想寫一個for循環,測試list上的兩個函數。第一個返回int,第二個返回boolean。如果boolean == False該函數應該從列表中刪除元素,所以最後在調用函數L後應該已經發生了變異。這是一個例子。錯誤迭代

def f(i): 
    return i + 2 

def g(i): 
    return i > 5 

L = [0, -10, 5, 6, -4] 

def applyF_filterG(L, f, g): 
    for i in L: 
     if g(f(i)) == False:   
      L.remove(i) 

L = [5, 6] 

我的問題是,上面寫的功能我得到L = [-10, 5, 6]回來,因爲如果i被刪除,i+1變成一個i+2,因爲被刪除的元素的。有人知道如何解決這個問題嗎?十分感謝!

+0

'對於我在L'而不是'L在這裏使用'[:]',它會迭代,儘管它是複製。 –

+0

'[我爲我在L如果我+ 2> 5]'這也給出了你期望的結果。 –

回答

5

您不應該在列表中移除列表中的元素。 只是創建一個新的列表L1等於L,並從L中移除元素並遍歷L1。

def f(i): 
    return i + 2 

def g(i): 
    return i > 5 

L = [0, -10, 5, 6, -4] 

def applyF_filterG(L, f, g): 
    L1 = list(L) 
    for i in L1: 
     if g(f(i)) == False:   
      L.remove(i) 


applyF_filterG(L, f, g) 

print L 
2

您能通過只產生另一個列表簡化這個:

L = [0, -10, 5, 6, -4] 
r = [a for a in L if a <= 5] 

或類似的東西?

+0

這些函數只是一個例子,它們可以改變。這就是爲什麼我不能在循環中更具體 –

+0

然後調用函數r = [a for a in if if(a)<= g()]但它仍然相同。您需要創建一個新列表,而不是從正在循環的列表中刪除項目。在循環之後,您可以分配L = r。 – Hannu