2017-05-06 5 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); 
    } 
} 

자,이 목록 a6 개까지 잘 작동합니다.

그런 다음 루프 인덱스는 6이고 목록의 7을 참조합니다. 7은 홀수이므로 목록에서 7을 제거합니다.

이제 루프 인덱스는 7이고 목록의 10을 가리 킵니다. 목록의 요소 9은 이제 루프에 의해 이미 확인 된 인덱스 6에 있습니다.

이렇게하면이 방법으로 오류가 발생합니다!

질문 : 위와 같은 상황이 발생하지 않고 하나의 목록 만 사용하고 요소 위에 한 번만 사용하십시오.

+0

. array.filter()를 사용하지 않는 이유는 무엇입니까? 이렇게하면 a의 모든 요소를 ​​반복하고 조건과 일치하는 값만 반환합니다. 따라서 var results = a.filter (function (element) {// 요소가 짝수이면 true를 반환하는 논리}); – nraduka

+0

@nraduka 이렇게하면 새 목록이 만들어지고 그 자리에서 목록을 변경하려고합니다. –

+0

새로운 목록을 만들지 않으려 고하면 - 항목을 제거 할 때마다 'i'를 감소시킬 수 있습니다. –

답변

1

일반적으로 현재 반복중인 목록을 변경하지 않는 것이 일반적입니다. 그러나 새 목록을 사용하거나 filter 방법을 대신 사용하십시오.

그러나, 당신은 당신과 같이 항목을 제거 할 때마다 i 카운터를 decerement 수 :

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

하고 작동해야하지만 당신은 a.length 같은, 그리고에 대한 크기의 스냅 샷을 사용하는 경우에만 주어진 시간에 목록.

편집 : 대한 C 스타일이 없기 때문에 파이썬에서, 그 결과는 다음과 같습니다 당신이 JS를 사용하는 것처럼 소리

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

그건 무한 루프 다. 너 혼자 해봐! 그리고 i는 JS에서 i가 감소하도록합니다. 그러나 python과 같은 언어에서는 i가 현재 반복에 대해서만 감소합니다. 다음 반복은 그 값이 정상이라고 가정합니다. – Arunava

+0

'python'에는이 C 스타일이 없습니다. 그래서 분명히 파이썬과 관련이 없습니다. –

+0

@Arunava 당신이 사용하는 언어 * *. 언어를 지정하지 않았으므로 일반적인 접근 방식을 사용했습니다. –