2012-10-01 9 views
10

하위 문자열과 일치하는 목록에서 요소를 제거하려면 어떻게해야합니까?하위 문자열과 일치하는 목록에서 항목 제거 - Python

내가 제거 할 필요가있는 몇 연속 누락 된 항목 것 같은 나는 pop()enumerate 방법을 사용하여 목록에서 요소를 제거하려고했지만 보인다 않은 :

sents = ['@$\tthis sentences needs to be removed', 'this doesnt', 
    '@$\tthis sentences also needs to be removed', 
    '@$\tthis sentences must be removed', 'this shouldnt', 
    '# this needs to be removed', 'this isnt', 
    '# this must', 'this musnt'] 

for i, j in enumerate(sents): 
    if j[0:3] == "@$\t": 
    sents.pop(i) 
    continue 
    if j[0] == "#": 
    sents.pop(i) 

for i in sents: 
    print i 

출력 :

this doesnt 
@$ this sentences must be removed 
this shouldnt 
this isnt 
#this should 
this musnt 

원하는 출력 :

this doesnt 
this shouldnt 
this isnt 
this musnt 
+3

목록을 반복하는 동안 목록에서 항목을 제거하는 전형적인 경우입니다. 여기에 관련된 수십 가지의 스택 오버 플로우 관련 질문을 읽어보십시오. 또한 [문서의 노트] (http://docs.python.org/reference/compound_stmts.html#for)를 참조하십시오. –

+1

컨테이너의 반복 길이를 변경하는 동안 항상 컨테이너의 길이를 변경하지 않는 것이 좋습니다. 이는 재앙을위한 방법입니다. – wim

+0

일반적으로 전체 목록을 수정하는 것보다 필터링 된 새 목록을 만드는 것이 좋습니다. 변경 불가능한 알고리즘은 항상 추론하기가 더 쉽습니다 (작성 방법을 쉽게 파악할 수있는 것은 아니지만). 값을 바꾸는 것만으로도 작업 환경의 효율성이 향상되는 경우도 있지만, 목록 가운데에서 삭제 또는 삽입 할 때는 일반적으로 덜 강력한 논리와 함께 효율성이 떨어집니다. – abarnert

답변

20

어떻게 ABO 간단한 같은 유타 뭔가 :

>>> [x for x in sents if not x.startswith('@$\t') and not x.startswith('#')] 
['this doesnt', 'this shouldnt', 'this isnt', 'this musnt'] 
+0

아, 목록 이해력, 우아! 나 해보자. – alvas

+0

가장 깨끗한 답변은 +1입니다. – abarnert

8

이 작동합니다 :

[i for i in sents if not ('@$\t' in i or '#' in i)] 

다음을 사용하여 str.startswith(stringOfInterest) 방법을

+2

나는이 부분이 부분 문자열이 처음에 있다고 가정하지 않기 때문에 다른 하나보다 더 낫다는 것을 주장 할 것입니다. 설명을 위해 – Frikster

9

또 다른 기술을 사용 sentential 지정된 시작에만 일을하려면 filter

filter(lambda s: not (s[0:3]=="@$\t" or s[0]=="#"), sents) 

origual approac의 문제점 h는 목록 항목 i에 있고 삭제해야한다고 판단한 경우 목록에서 제거하여 i+1 항목을 i 위치로 슬라이드시킵니다. 루프의 다음 반복은 인덱스 i+1에 있지만 실제로는 i+2입니다.

의미가 있습니까?

+0

감사합니다! 열거하는 동안 목록을 터는 것은 실제로 어리석은 일입니다. hahaha .. – alvas

+0

+1 문제를 설명합니다. – abarnert

관련 문제