2012-09-28 2 views
4

저는 생성기 기능을 작성하고 있습니다. (: 이상적으로 지능형리스트로, 더 파이썬 읽기) 이런 식으로 뭔가를 구현하는 방법을 : 나는 더 나은이 있는지 알고 싶어목록 이해에서 캡처 및 출력

generator = gen() 
captures = [] 
for _ in xrange(x): 
    foo = next(generator) 
    directories.append(foo['name']) 
    yield foo 
여기서 핵심은 내가 전체 수득율을 캡처 할 없다는 것입니다

gen()에 의해 반환 된 사전은 커다. 그래서 나는 발전기를 사용하고있다. 나는 모든 '이름'을 포착 할 필요가있다. 목록 작성으로이 작업을 수행 할 수있는 방법이있는 것처럼 느껴지지만 지금은 보지 않고 있습니다. 생각? 더 파이썬

답변

6

이 작업을 수행하려면 다른/짧은 방법이 있습니다,하지만 난 그것을 호출 할 것이다 :

generator = gen() 
directories = [] 
generator_wrapper = (directories.append(foo['name']) or foo 
         for foo in generator) 

이, 파이썬의 모든 돌연변이 방법처럼, 항상 None를 반환 append 사실을 활용 따라서 .append(...) or foo은 항상 foo으로 평가됩니다.

그런 식으로 전체 사전은 여전히 ​​생성자 표현식의 결과이며 여전히 지연 평가가되지만 이름은 여전히 ​​directories 목록에 저장됩니다.

또한 명시 적 for 루프에서이 방법을 사용할 수 있습니다 심지어

for foo in generator: 
    yield directories.append(foo['name']) or foo 

또는 당신의 루프 조금 단순화 :

for foo in generator: 
    directories.append(foo['name']) 
    yield foo 

을 단지에 xrange를 사용하는 이유가 없기 때문에 생성기를 반복합니다 (실제로 알려진 단계 수만 반복하지 않는 한).

+0

xrange는 세대()을 반복하기 때문에 영원히, 나는 루프 영원히 반복하는 원하지 않는다 : itertools.islice 사용합니다. 나는 islice를 사용할 수 있었다. 나는 마지막 하나가 대답이라고 생각한다. – Lucretiel

0

먼저 x 발전기의 많은 요소를 원하십니까?

directories = [item['name'] for item in itertools.islice(gen(), x)] 
+2

그러나 이것은 항목을 산출하지 않습니다. – Lucretiel