2017-05-06 43 views
0

編程時常見的情況是,給定一個列表,當條件爲真時,我們必須遍歷列表和pop()元素。避免忽略元素的方法,同時循環列表並彈出同一列表中的元素

現在,在這種情況下,例如說我有一個列表a = [1, 2, 3, 4, 5, 6, 7, 9, 10],並且問題要求從列表中刪除奇怪的所有元素。

所以,我只是採取這樣的方法。現在

for (int i=0; i<=a.length; i++) { 
    if (a[i]%2 != 0) { 
     a.removeElementAtIndex(i); 
    } 
} 

,這將在列表a做工精細高達6

之後,循環索引將爲6,那將在列表中引用7。由於7是一個奇數,它會從列表中刪除7

現在,循環索引將爲7,它將指向列表中的10。並且列表中的元素9現在處於索引6,其已由循環檢查。

所以,這種方法會導致錯誤!

問題:一種不會導致上述情況的方法,也可以只使用一個列表並且僅在元素上循環一次。

+0

這聽起來像你正在使用JS。爲什麼不使用array.filter()?這將迭代a中的所有元素,並僅返回符合條件的值。所以var results = a.filter(function(element){//如果元素是偶數則返回true的邏輯}); – nraduka

+0

@nraduka它通過這樣做創建一個新列表,他想在原地更改列表。 –

+0

如果你真的堅持不要創建一個新的列表 - 你可以每次刪除一個項目時減少「我」。 –

回答

1

一般來說,通常不會更改當前正在迭代的列表。但是要使用新的列表,或者使用filter方法。

但是,你可以decerement的i計數器每次你刪除一個項目,像這樣:

for (int i=0; i<=a.length; i++) { 
    if (a[i]%2 != 0) { 
     a.removeElementAtIndex(i); 
     i--; 
    } 
} 

,它應該工作,但是隻有當你使用類似a.length,而不是規模上的快照在特定時間的列表。

編輯:蟒蛇,因爲沒有一個C風格的,它應該是這樣的:

In [3]: i = 0 

In [4]: a = list(range(12)) 

In [5]: while i < len(a): 
    ...:  if a[i] % 2 != 0: 
    ...:   a.remove(a[i]) 
    ...:   i -= 1 
    ...:  i += 1 
    ...:  

In [6]: a 
Out[6]: [0, 2, 4, 6, 8, 10] 
+0

這是一個無限循環!自己嘗試!而我 - 導致我在JS中減少。但是在像python這樣的語言中,我只會減少當前迭代次數。下一次迭代只是它應該正常的值。 – Arunava

+0

'python'沒有這個c風格。顯然,它不能與python相關。 –

+0

@Arunava你正在使用哪種語言*。由於您沒有指定語言,因此我給出了一般方法。 –

相關問題