2012-09-28 24 views
4

我在寫一個生成器函數。我想知道是否有一個更好的(閱讀:更Python,最好是使用列表理解)的方式來實現這樣的事情:清單理解中的捕獲和產出

generator = gen() 
captures = [] 
for _ in xrange(x): 
    foo = next(generator) 
    directories.append(foo['name']) 
    yield foo 

這裏的關鍵是,我不想捕獲整個的產量由gen()返回的字典很大,這就是我使用生成器的原因。儘管如此,我確實需要捕捉所有'名字'。我覺得有一種方法可以用列表理解來做到這一點,但我只是沒有看到它。思考?

回答

6

還有另一個/較短的方式做到這一點,但我不會把它更Python:

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

這需要的是append,所有的Python變異方法,比如,總是返回None的事實優勢因此.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是因爲gen()迭代到永遠,我不希望for循環永遠迭代。不過,我可以使用islice。我認爲最後一個就是答案。 – Lucretiel

0

你想要第一個x發生器的很多元素?使用itertools.islice

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

雖然這不會產生該項目。 – Lucretiel