내용을 기반으로 문자열 목록 필터링


103

list가 주어지면 ['a','ab','abc','bac']문자열이있는 목록을 계산하고 싶습니다 'ab'. 즉 결과는 ['ab','abc']. 파이썬에서 어떻게 할 수 있습니까?

답변:


171

이 간단한 필터링은 Python을 사용하여 여러 방법으로 달성 할 수 있습니다. 가장 좋은 방법은 다음과 같이 "목록 이해"를 사용하는 것입니다.

>>> lst = ['a', 'ab', 'abc', 'bac']
>>> [k for k in lst if 'ab' in k]
['ab', 'abc']

또 다른 방법은 filter기능 을 사용하는 것입니다. Python 2 :

>>> filter(lambda k: 'ab' in k, lst)
['ab', 'abc']

Python 3에서는 목록 대신 반복자 를 반환 하지만 캐스트 할 수 있습니다.

>>> list(filter(lambda k: 'ab' in k, lst))
['ab', 'abc']

이해력을 사용하는 것이 더 나은 연습입니다.


30
@ S.Lott : 왜? 적절한 맥락에서 유용한 고급 프로그래밍 주제를 배우는 것이 잘못된 것은 무엇입니까?
Eli Bendersky

12
@ S.Lott : 람다는 일부 프로그래밍 패러다임에 중요한 일급 객체로서의 함수 고려를 촉진하고 있다고 생각합니다. 나는 그들이 나에게 매우 중요하다고 말하지는 않겠지 만, 초보자도 이런 식으로 프로그래밍에 대해 생각하면 이득을 볼 수 있다고 믿고, 분명히 그것을 inflicting 이라고 부르지 않을 것입니다 .
Eli Bendersky

6
@ S.Lott :하지만이 경우 lambda에 완벽한 동반자가 filter아닐까요? ab주어진 목록 에 있는지 확인하기 위해 별도의 함수를 작성하는 것은 과잉 이라고 생각합니다 . 따라서 기본적으로 in연산자를 래핑하는보다 일반적인 함수를 작성하는 것 입니다. 여기 filter없이 어떻게 더 명확하게 사용 lambda하시겠습니까?
Eli Bendersky

5
이 답변을 찾는 것은 n00bs 뿐만이 아닙니다
Bryan

9
저는 n00b이고 이제 람다를 소개 받았습니다. 그것을 알고 굉장한 느낌. 이제 그것에 대해 더 배울 것입니다.
a_secenthusiast 2015-06-16


16
# To support matches from the beginning, not any matches:

items = ['a', 'ab', 'abc', 'bac']
prefix = 'ab'

filter(lambda x: x.startswith(prefix), items)

이것은 파이썬 객체 유형이므로 변수 이름으로 목록을 피하십시오.
Rutger Hofste

6

대화 형 셸에서 빠르게 시도했습니다.

>>> l = ['a', 'ab', 'abc', 'bac']
>>> [x for x in l if 'ab' in x]
['ab', 'abc']
>>>

왜 이것이 작동합니까? in연산자 는 "의 하위 문자열"을 의미하는 문자열에 대해 정의 되기 때문 입니다.

또한 위에서 사용 된 목록 이해 구문 을 사용하는 대신 루프 작성을 고려할 수 있습니다 .

l = ['a', 'ab', 'abc', 'bac']
result = []
for s in l:
   if 'ab' in s:
       result.append(s)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.