2014-07-10 3 views
0

모든 루프마다 조건 변경과 같은 논리가 필요한 프로그램이 있습니다. 명확하게 이해하려면 코드를 참조하십시오.조건 업데이트 안 함 : python

프로그램 : 내가 포함 된 두 개의 목록이 다시 (ab)이 나열되어 있습니다. a의 하위 목록의 두 번째 요소가 b의 하위 목록의 두 번째 요소와 일치하면 둘 다 삭제해야합니다.

코드 :

a = [[1, 2, 3], ['a', 'b'], ['1', '2'], ['#', '$' '%']] 
b = [['c', 'b'], ['0', '2']] 

for i in range(0, len(a)): 
    for j in range(0, len(b)): 
     if a[i][1] == b[j][1]: 
      del a[i] 
      del b[j] 
print(a) 
print(b) 

오류 : IndexError. 나는 그것이 for 상태이기 때문에 그것이 이해할 수있다.

breakcontinue을 사용하면 복잡해집니다.
이렇게 변경할 수있는 솔루션은 무엇입니까?

+0

해결 *. 당신은 무엇을 기대 했습니까?! – jonrsharpe

+0

목록이 현재 위치에서 수정되는 것이 중요합니까? –

+0

예 @JamieCockburn – SGG

답변

1

일반적으로 루프 내의 목록에서 삭제하지 않는 것이 좋습니다. 어쨌든 전체 구조는 비효율적입니다.삭제해야 요소를 결정하고 이러한 요소없이 새로운 목록을 만들 : 원래의 길이로 반복하면서

가능한
A = [[1, 2, 3], ['a', 'b'], ['1', '2'], ['#', '$' '%']] 
B = [['c', 'b'], ['0', '2']] 

C = set(a[1] for a in A) & set(b[1] for b in B) 

A = [a for a in A if a[1] not in C] 
B = [b for b in B if b[1] not in C] 

print(A) 
print(B) 
+0

목록에 따라 OP를 수정해야합니다. –

+0

@JamieCockburn 그런 다음 이전 목록의 내용을 새 목록으로 바꿉니다. 'A [:] = ... '. – BlackJack

3

문제는 항목을 제거 할 때 (예 : b) 범위가 이미 결정되어 색인이 범위를 벗어납니다. @RevanProdigalKnight가 지적으로

당신 거꾸로 반복에 의해이 문제를 해결 할 수 있습니다

당신은 단지 하나의 행 제거하려면
a = [[1, 2, 3], ['a', 'b'], ['1', '2'], ['#', '$' '%']] 
b = [['c', 'b'], ['0', '2']] 

for i in range(len(a)-1,-1,-1): 
    for j in range(len(b)-1,-1,-1): 
     if a[i][1] == b[j][1]: 
      del a[i] 
      del b[j] 
      break 
print(a) 
print(b) 

해당하는 경우b에 있습니다. 당신이 b의 모든 사본을 제거 할 반면에 경우

, 시도 :

for i in range(len(a)-1,-1,-1): 
    key = a[i][1] 
    removed = 0 
    for j in range(len(b)-1,-1,-1): 
     if key == b[j][1]: 
      del b[j] 
      removed = 1 
    if removed == 1 
     del a[i] 
print(a) 
print(b) 

차이? 발생합니다 그리고 최초의 알고리즘을 사용하여

a = [[0,0],[1,1],[2,2]] 
b = [[0,0],[2,1],[3,0]] 

:

는 두 배열이 말 두 번째가됩니다 동안

a = [[2,2]] 
b = [[0,0]] 

을에서 :

a = [[2,2]] 
b = [] 
+0

올바르게 기억한다면 'range (len (object), 0)'를 사용하여 목록을 역순으로 반복하면 해결할 수 있습니다. – RevanProdigalKnight

+0

사실. 그러나 당신은 단계를'-1'과'len (object) -1'로 설정해야합니다. –

+0

그리고 내부 루프에서 벗어날 뭔가를해야합니다. –

2

하나의 솔루션 삭제하려는 인덱스를 추적 한 후 나중에 제거하는 것입니다. 가장 높은 지수에서 가장 낮은 지수로 내려갑니다.

EDIT : 구현;

a = [[1, 2, 3], ['a', 'b'], ['1', '2'], ['#', '$' '%']] 
b = [['c', 'b'], ['0', '2']] 

a_del = [] 
b_del = [] 

for i in range(0, len(a)): 
    for j in range(0, len(b)): 
     if a[i][1] == b[j][1]: 
      a_del.append(i) 
      b_del.append(j) 

for idx in reversed(a_del): 
    del a[idx] 

for idx in reversed(b_del): 
    del b[idx] 

print(a) 
print(b) 
-1

* 당신이 목록의 길이를 수정하는

for data in zip(a,b): 
if (data[0][1] == data[1][1]): 
    #do whatever 
+0

이것은 내가 생각하는 값을 복사해야합니다. 어느 것이 매우 노동 집약적 일 수 있습니다. –

+0

@Hima 원본은'a'의 모든 요소와'b '의 모든 요소를 ​​비교합니다. 여러분의 색인은 동일한 색인에 있습니다. 그리고 두 요소 중 짧은 것의 길이만큼 요소가 있습니다. – BlackJack

+0

@BlackJack +1 대답! 최고. – Hima

관련 문제