2017-05-06 46 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你正在使用哪种语言*。由于您没有指定语言,因此我给出了一般方法。 –

相关问题