술어와 일치하는 순서로 첫 번째 요소 찾기 [중복]
술어와 일치하는 목록에서 첫 번째 요소를 찾는 관용적 방법을 원합니다.
현재 코드는 매우 추악합니다.
[x for x in seq if predicate(x)][0]
나는 그것을 다음과 같이 바꾸는 것에 대해 생각했다.
from itertools import dropwhile
dropwhile(lambda x: not predicate(x), seq).next()
그러나 더 우아한 것이 있어야합니다 ... 그리고 None
일치하는 것이 없으면 예외를 제기하는 대신 값을 반환하면 좋을 것 입니다.
나는 다음과 같은 함수를 정의 할 수 있다는 것을 알고있다.
def get_first(predicate, seq):
for i in seq:
if predicate(i): return i
return None
그러나 이미 동일한 기능을 제공하는 내장 기능이있는 경우 이와 같은 유틸리티 기능으로 코드를 채우기 시작하는 것은 무의미합니다.
next(x for x in seq if predicate(x))
그것은 제기 StopIteration
존재하지 않는 경우.
next(ifilter(predicate, seq), None)
None
그러한 요소가 없으면를 반환 합니다.
기본값으로 생성기 표현식을 사용한 후 다음을 사용할 next
수 있습니다.
next((x for x in seq if predicate(x)), None)
이 one-liner의 경우 Python> = 2.6을 사용해야합니다.
이 인기있는 기사는이 문제에 대해 더 자세히 설명합니다. 가장 깨끗한 Python 찾기 기능? .
귀하의 질문에 제안한 솔루션에 문제가 있다고 생각하지 않습니다.
내 자신의 코드에서는 다음과 같이 구현합니다.
(x for x in seq if predicate(x)).next()
with 구문은를 사용하여 ()
모든 목록을 한 번에 생성하는 것보다 효율적인 생성기 를 만듭니다 []
.
JF Sebastian의 대답은 가장 우아하지만 포트란이 지적한 것처럼 Python 2.6이 필요합니다.
Python 버전 <2.6의 경우 다음과 같이 할 수있는 최선의 방법이 있습니다.
from itertools import repeat,ifilter,chain
chain(ifilter(predicate,seq),repeat(None)).next()
또는 나중에 목록이 필요하거나 (목록이 StopIteration을 처리 함) 첫 번째 항목 이상을 필요로하는 경우에도 islice를 사용하여 수행 할 수 있습니다.
from itertools import islice,ifilter
list(islice(ifilter(predicate,seq),1))
업데이트 : 개인적으로 StopIteration을 포착하고 None을 반환하는 first ()라는 미리 정의 된 함수를 사용하고 있지만 위의 예제에 비해 가능한 개선 사항은 다음과 같습니다. filter / ifilter를 사용하지 마십시오.
from itertools import islice,chain
chain((x for x in seq if predicate(x)),repeat(None)).next()
'IT' 카테고리의 다른 글
inheritInChildApplications를 사용하여 자식 웹 응용 프로그램에서 web.config 상속을 피하십시오. (0) | 2020.06.13 |
---|---|
lodash를 사용하여 목록에서 요소를 제거하는 방법은 무엇입니까? (0) | 2020.06.13 |
모범 사례가없는 경우 SQL Server 삽입 (0) | 2020.06.13 |
다양한 깊이의 중첩 된 사전 값 업데이트 (0) | 2020.06.13 |
루프 나 조건문없이 1부터 1000까지 인쇄하는 C 코드는 어떻게 작동합니까? (0) | 2020.06.13 |