2012-02-06 2 views
3

목록을 중재하는 동안 현재 목록의 ID를 참조하여 해당 목록을 참조 할 수 있습니까? 간단한 예 목록을 중재하면서 색인을 얻는 중

xl = [1,2,3] # initial list 
yl = [3,2] # list used to remove items from initial list 

for x in xl[:]: 
    for y in yl: 
     if x == y: 
      xl.pop(x) # problem 
      break 
     print x, y 
print xl 

, 나는이 목록을 통해 루프를 원하고, 내가 유사한 항목을 찾을 때, 내가 선 대신 X의 무엇을 사용해야 1.

댓글을 달았 목록에서 제거 "#problem"?

추신 : 내가 iterating에서 복사 해요. 대신 당신이 좋아하지 않는 요소를 제거

답변

8

일반적인 방법은 enumerate입니다.

for idx, item in enumerate(iterable): 
    pass 

그러나 사용 사례에 따라 시도하는 것처럼 보이지는 않습니다. 목록을 반복하고 동시에 수정하는 것은 피해야합니다. 목록 이해력을 사용하십시오 :

xl = [item for item in xl if item not in yl] 
+1

+1 열거하고 생각합니다. 사본을 통해 그것을하고 있지만 안전하지 않을 수도 있지만 효율적입니다. – jdi

2

, 당신은 단순히 filter를 사용한다 : 또는

x1 = filter(x1, lambda x: x not in y1) 

하는 list comprehension을 작품뿐만 아니라 :

x1 = [x for x in x1 if x not in y1] 

을 Y1이 매우 큰 경우, 당신이해야 다음과 같이 세트를 조회하십시오.

y1set = set(y1) 
x1 = filter(x1, lambda x: x not in y1set) 

참조 용으로, pop은 색인을 취하고 색인을 얻는 일반적인 방법은 enumerate입니다. 그러나 거의 모든 경우에 색인을 사용하는 것보다 코드를 작성하는 데 더 짧고 깨끗한 방법이 있습니다. 대한 xl = [x for x in xl if x not in y]

이는 list comprehension로 알려져 어떻게

+0

이것은 실제로 데이터베이스에 매핑입니다. 그래서이 경우 나는 색인을 유지하고 싶다. 내 비즈니스 논리에서 DB에서 제거하면 메모리 목록에서 제거됩니다. DB와 일치하는 명시적인 인덱스를 사용하여 끝낼 것이라고 생각합니다. – gcb

+0

@gcb 인덱스를 유지하려면'pop'을 사용해서는 안되지만'x1'리스트의 엔트리를 마커 값으로 설정해야합니다. '없음'으로 표시됩니다. – phihag

+0

나는 인덱스도 삭제하려고합니다. – gcb

4

.

+0

'간단한 예제'였습니다. HTTP 요청과 2 개의 숫자와 일치하는 것만 큼 점검하지 않아야합니다. – gcb

+2

@gcb 그건 문제가되지 않습니다. 'checkHttpRequestsAndWhatNot (x) ''이면 xl = [x의 경우 x를 사용합니다.] 또는 더 짧게'x1 = filter (x1, checkHttpRequestsAndWhatNot)'를 사용하여 원하는만큼 검사 할 수 있습니다. – phihag

+0

그게 좋은 지적이야. 내가 지금 사용하고있는 구조를 검토 할 것 같아. – gcb

관련 문제