2014-06-23 9 views
0

숫자 4가 다음 목록에서 제거되지 않는 이유는 무엇입니까?목록에서 제거 파이썬 목록 이해

>>> list=[1,2,3,4] 
>>> [list.remove(item) for item in list if item > 2] 
[None] 
>>> list 
[1, 2, 4] 

또한, 난 할 노력하고있어 항목이 listB에있는 경우 listA에서 항목을 제거합니다. 목록으로 어떻게 이해할 수 있습니까? 내가 얼마나 또한

: 모든

list2=["prefix1","prefix2"] 
[item for item in list if not "item starts with a prefix in list2"] # pseudocode 
+2

개체를 반복 할 때 개체의 요소를 삭제하면 색인이 이동하여 다음 값을 건너 뜁니다. 그래서 여기서 결코 평가받지 않습니다. 따라서 루프 전에 사본을 만든 다음 객체를 교체하는 것이 중요합니다. – Llopis

+1

어쨌든'items'은 무엇입니까? – vaultah

+0

가능한 복제본 [Python으로 반복하면서 목록에서 항목 제거] (http://stackoverflow.com/questions/1207406/remove-items-from-a-list-while-iter-iterating-in-python) –

답변

4

첫째, 단지 그것의 부작용에 대한 지능형리스트를 사용하여 나쁜 방법입니다. 이미 내장 목록에 의해 촬영 때문에 변수 이름으로 list을 사용하지 않는, 또한

lst = [x for x in lst if x <= 2] 

사용해야합니다. 셋째, 돌연변이를 일으키면서 목록을 반복하고 있기 때문에 접근법이 작동하지 않습니다. 당신이 볼 수 있듯이

# python interpreter 
>>> lst = [1,2,3,4] 
>>> for item in lst: 
...  print(item) 
...  if item > 2: 
...   lst.remove(item) 
...  print(lst) 
... 
1 
[1, 2, 3, 4] 
2 
[1, 2, 3, 4] 
3 
[1, 2, 4] 

item4 결코 :

여기에 당신의 접근 방식에 무슨 일이 일어나고 있는지의 데모입니다. 두 번째 질문에 대해서는

은 : 항목이 listB에있는 경우

또한

, 난 할 노력하고있어 listA에서 항목을 제거합니다. 목록 이해력으로 어떻게이 작업을 수행 할 수 있습니까? 세 번째 질문에 대해서는

bset = set(listB) 
listA = [x for x in listA if x not in bset] 

:

>>> list1=['prefix1hello', 'foo', 'prefix2hello', 'hello'] 
>>> prefixes=['prefix1', 'prefix2'] 
>>> [x for x in list1 if not any(x.startswith(prefix) for prefix in prefixes)] 
['foo', 'hello'] 

이제 새로운 질문을 추가하는 중지하십시오, 당신은, 덕분에 다른 문제에 대한 새로운 질문을 열 수 있습니다.

+0

완벽한 사람! 내 게시물을 조금 업데이트했는데 두 번째 문제가 목록 이해를 사용하여 해결할 수 있는지 알 수 있습니까? – user3388884

+0

아마도'lst [:] = [x가 x <= 2 인 경우에는 x에 대해 x에 대해''미묘하게 좋을 것입니다. – kojiro

+0

@ user3388884 업데이트 됨 – timgeb