2011-08-29 11 views
1

꽤 많은 시간 동안 목록을 반복하고 내가 현재있는 항목을 제거하는 방법을 찾아 내려고 노력했습니다. 이 일을 내가 원하는대로 할 수없는 것 같습니다. 1 회 반복하지만 2 회 반복하고 싶었습니다. 제거 줄을 제거하면 2 번 반복됩니다.루프의 목록에서 항목 제거

a = [0, 1] 
for i in a: 
    z = a 
    print z.remove(i) 

출력 : 내가 기다리고 있었다

[1] 

출력 : 당신이 그것을 통해 반복하는 동안

[1] 
[0] 
+0

나는 왜 당신이 결과를 전혀 얻지 모르겠다. 나는'z.remove (i)'가'None'을 리턴 할 것이라고 생각했다. – wim

답변

3

그것은 나쁜 연습을하는 목록을 수정한다. 목록의 복사본을 만듭니다. 예컨대 :이 나쁜 관행 순서가 반복시 변경 될 때 순서를 통해 반복자에 어떤 일이 일어나는지의 구현 세부 사항을 고려 이유의 요지를 들어

oldlist = ['a', 'b', 'spam', 'c'] 
newlist = filter(lambda x: x != 'spam', oldlist) 

†. 현재 항목을 제거한 경우 반복기가 원래 목록의 다음 항목이나 수정 된 목록의 다음 항목을 가리켜 야합니까? 결정 절차에 따라 이전의 (또는 다음) 항목이 현재의 항목으로 제거되면 어떻게됩니까?


어떤 사람들은 지능형리스트와 필터, 상응하는 일을 좋아하지 않는다 :

newlist = [x for x in oldlist if x != 'spam'] 
+0

이 메서드에는 필터 대신 목록 이해를 사용하십시오. – agf

2

문제는 지수는 현재 과거 때문에 당신이 aremove 너무 루프가 종료를 수정하고 있다는 것입니다 그것의 끝.

+0

그래서 그는 대신 무엇을해야합니까? – agf

+0

나는 파이썬 사람이 아니기 때문에 문법을 찾아야 하겠지만'while while'이나'while pop'을 할 수 있다고 가정하고 있습니까? –

+0

나도 알아, 나는 네가 그에게 어떻게해야하는지 말하지 않았으니 여기에 정말로 대답하지 않았다고 말하는 것 뿐이다. – agf

8

반복하는 동안 목록을 변경하는 중 - z = a은 복사하지 않으며 z은 같은 위치에 a 점을 나타냅니다.

는 명시 적 루프가 필요하지 않은 경우, 당신은 지능형리스트와 조건을 일치하는 항목을 제거 할 수 있습니다

for i in a[:]:   # slicing a list makes a copy 
    print i    # remove doesn't return the item so print it here 
    a.remove(i)   # remove the item from the original list 

또는

while a:    # while the list is not empty 
    print a.pop(0)  # remove the first item from the list 

보십시오 :

a = [i for i in a if i] # remove all items that evaluate to false 
a = [i for i in a if condition(i)] # remove items where the condition is False 
+0

출력은 이제 "None None"입니다. – MJA

+0

'remove'는 아무 것도 반환하지 않으므로'None'을 출력합니다. 항목을 지우기 전에 항목을 인쇄하려면'print i' 다음에'a.remove (i)'를하십시오. 'pop' 버전은 실제로 주어진 인덱스에있는 항목을 반환하므로 항목을'인쇄 '합니다. 이것을 반영하기 위해 내 대답을 편집했습니다. – agf

1

목록을 반복하는 동안 목록의 여러 항목을 제거하려고 시도하지 마십시오. 파이썬뿐만 아니라 다른 프로그래밍 언어에서도 따라야하는 것이 일반적인 규칙이라고 생각합니다.

제거 할 항목을 별도의 목록에 추가 할 수 있습니다. 그런 다음 원래 목록에서 새 목록의 모든 개체를 제거합니다.