술어와 일치하는 시퀀스에서 첫 번째 요소 찾기
목록에서 술어와 일치하는 첫 번째 요소를 찾을 수 있는 관용적인 방법을 원합니다.
현재 코드는 매우 추악합니다.
[x for x in seq if predicate(x)][0]
나는 그것을 다음과 같이 바꿀까 생각하고 있다.
from itertools import dropwhile
dropwhile(lambda x: not predicate(x), seq).next()
하지만 뭔가 더 우아한 게 있을 거야그리고 그것이 a를 반환해 준다면 좋을 것이다.None
일치하는 항목이 없는 경우 예외를 발생시키지 않고 값을 지정합니다.
다음과 같은 함수를 정의할 수 있습니다.
def get_first(predicate, seq):
for i in seq:
if predicate(i): return i
return None
그러나 이와 같이 코드를 유틸리티 함수로 채우기 시작하는 것은 전혀 맛이 없습니다(또한 이미 존재하는 것을 사람들은 알아차리지 못하기 때문에 시간이 지남에 따라 반복되는 경향이 있습니다).
시퀀스에서 첫 번째 요소를 찾으려면seq
일치하다predicate
:
next(x for x in seq if predicate(x))
또는 간단하게:
Python 2:
next(itertools.ifilter(predicate, seq))
Python 3:
next(filter(predicate, seq))
이 때문에,StopIteration
어떤 요소에 대해서도 술어가 일치하지 않는 경우 예외입니다.
되돌아가다None
이러한 요소가 없는 경우:
next((x for x in seq if predicate(x)), None)
또는 다음 중 하나를 선택합니다.
next(filter(predicate, seq), None)
생성기 식을 기본값과 함께 사용하여next
다음 중 하나를 선택합니다.
next((x for x in seq if predicate(x)), None)
단, 이 한 줄의 경우 Python > = 2.6을 사용해야 합니다.
이 다소 인기 있는 기사에서는 이 문제에 대해 자세히 설명합니다.Python find-in-list 함수를 청소하시겠습니까?
저는 당신이 질문에서 제안한 어떤 해결책에도 문제가 없다고 생각합니다.
제 코드로 다음과 같이 구현합니다.
(x for x in seq if predicate(x)).next()
와의 구문()
모든 목록을 동시에 생성하는 것보다 효율적인 제너레이터를 만듭니다.[]
.
J.F. Sebastian의 답변은 가장 우아하지만 Fortran이 지적한 것처럼 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()라는 정의된 함수를 사용하고 있지만, 위의 예에서 가능한 개선점을 소개합니다.필터 / ifilter를 사용하지 마십시오.
from itertools import islice,chain
chain((x for x in seq if predicate(x)),repeat(None)).next()
언급URL : https://stackoverflow.com/questions/8534256/find-first-element-in-a-sequence-that-matches-a-predicate
'source' 카테고리의 다른 글
FOUND_ROWS가 있는 SQL_CALC_FOUND_ROWS는 항상 1을 반환합니다. (0) | 2022.11.25 |
---|---|
Test Containers Framework가 도커 deamon에 연결할 수 없습니다. (0) | 2022.11.25 |
Java: Python의 범위(int, int)와 동등합니까? (0) | 2022.11.25 |
Linux 위의 MariaDB | .sql 데이터베이스 접근 (0) | 2022.11.25 |
변수가 Python에 정의되어 있는지 확인합니다. (0) | 2022.11.25 |