2016-12-13 1 views
3

여기에 Generators/List Comprehension에 관한 일반적인 Python 질문이 있습니다. 주어진 반복 가능한 x를 들어 두 번 필요하다면 목록 내역에서 한 번만 함수 호출을 수행하십시오.

나는 다음과 같다 목록 이해가 필요합니다

[ flatten(e) for e in x if flatten(e) != '' ] 

는 한 번만 호출 좋을 것이다 있도록 기능 flatten은 잠재적으로 비싸다. 표현할 일선에서이 작업을 수행 할 수있는 방법이 있습니까?

+0

두 개의 질문이 (가) * * 플래그 ... "로컬 변수"질문의 대답은 참으로이 질문에 대한 도움말을 할 수 있지만, 대답의 간결함이 제공하는 중복 충분히 공유하는 경우 확실하지 @selcuk Mmmh, 여기에 "지역 변수"질문에 대한 답변에 필적 할만한 것이 없습니다. – halloleo

+0

나는 받아 들여지는 응답조차도 여기에서 거의 동일하다는 것에 동의하지 않는다. – Selcuk

답변

5

둥지 발전기 :-) 더 나은 생각하지 않습니다 :

당신 는 또한 다음과 같이 작성할 수있다

[item for item in (flatten(e) for e in x) if item != ''] 

또는 :

[item for item in map(flatten, x) if item != ''] 
3

아니요 ... 일반적으로 2 단계로 수행하는 것이 좋습니다.

flattened = (flatten(e) for e in x) 
[f for f in flattened if f] 

당신은 목록 - 완에 발전기를 둘 수 있었다, 그러나 나는 그 일을하는 것은 약간의 이득 (IMHO)에 대한 가독성을 다치게하는 경향이 있음을 발견 : 첫 번째 단계는 두 번째 단계 필터를 평평하게.

list(filter(None, map(flatten, e))) 

하지만 그

+1

나는이 대답을 많이 좋아한다! 질문이 한 줄짜리 언어로 표현되었지만, 두 줄로 나누면 이모티콘을 더 쉽게 읽을 수 있습니다. – halloleo

0

map 기능을 사용하십시오.

[ e for e in map(flatten, x) if e != '' ] 
+1

nit : 불필요한 람다 ...'map (flatten, x)'도 마찬가지입니다. – mgilson

관련 문제