2013-08-13 2 views
1

에 적용했다. 내장 된 any 함수와는 달리, 사실이라고 간주되는 목록의 첫 번째 값을 가져와야합니다. 그래서 0 or "foo" or 3.2에 대해서 "foo"이 필요합니다. 단지 True이 아닙니다.바로 가기 또는 체인 내가 같은 것을 할 싶습니다 목록

물론, 내가

def returnFirst(f, a): 
    for i in a: 
    v = f(i) 
    if v: 
     return v 
    return False 

x = returnFirst(f, a) 

같은 작은 기능을 쓸 수 있지만 또한 this SO question에 주어진 이유는, 아마도 가장 좋은 해결책이 아니다. 이 다른 스레드에 대해 언급 할 때, 물론 제공된 솔루션을 기반으로하는 코드를 사용할 수 있습니다.

x = next((f(x) for x in a if f(x)), False) 

하지만 다음 f의 두 배 부름을 회피하는 간단한 방법이 표시되지 않습니다.

내가 누락되었거나 모르는 간단한 해결책이 있습니까? 같은 것

OR((f(x) for x in a)) 

어쩌면?

나는 이와 관련하여 다른 질문을 찾으려고했지만 or과 같은 키워드를 검색하는 것은 약간 문제가 있으므로 어쩌면 적절한 것을 찾지 못했을 것입니다.

+1

'returnFirst'에는 아무런 문제가 없습니다. 한 곳에서 캡슐화되었습니다. 사람들이 사용하지 않을 것이므로 존재하지 않는 필요한 유틸리티 기능을 만들지 않으면 다른 사람의 작업 과정을 최적화하려고합니다. 나는 그것이 맛이 없다는 것에 동의한다. 적은 양의 문서만으로 문제를 완전히 해결할 수 있습니다. – Crisfole

+5

중복 : http : //stackoverflow.com/questions/1077307/why-is-there-no-firstiterable-built-in-function-in-python –

답변

0

(특히 x, f, av이 1 자 이상인 경우)

나는 더 나은 해결책에 대해 듣고 기쁘게 생각합니다.

2

이 작동합니다 :

x = next((v for v in (f(x) for x in a) if v), False) 

그것은 여전히 ​​작동 f의 전화를 두 배로없이 해키 지역을 도입하지 않고 관용구,하지만가요 : 지금이 사용하고

next((x for y in a for x in (f(y),) if x),False) 
+0

아, 펀치를 때려. 아무 것도 없으면'False'를 반환합니까 아니면'None'입니까? 기본값 ('s/if x/if x, False /')을 더하고 싶을 수도 있습니다. – Crisfole

+0

다시 이길 !! – Crisfole

+0

그래, 나는 우려의 "지역 변수"를 가지고 발전기의 남용을 정말로 좋아하지 않는다. 그러나 그것은 올바르게 작동한다. Upvote. – Alfe