2017-04-20 56 views
1

我寫作這樣的事情掙扎:爲什麼不反轉()接受一個發生器?

list(reversed(list(el.iterancestors()))) + [1,2,3] 

凡發電機吮吸,因爲我不得不給他們消費進入名單。

有沒有辦法簡化這個?我認爲reversed()應該接受一個迭代器,我錯了嗎?

回答

9

發電機不保證有最後一項,所以不能顛倒。以下的輸出是什麼?

from itertools import cycle 

reversed(cycle('abc')) 

還有一不小心吃的都是你的記憶的風險:

from itertools import permutations 
reversed(permutations('abcdefghijklmnopqrstuvwxyz', 10)) # 19,275,223,968,000 tuples 

注意的reversed()的一點是一定要內存使用效率。對於序列,所以具有索引(列表,字符串,元組,範圍)的對象reversed()會生成一個迭代器,該迭代器使用內部索引,該索引在迭代時開始於len(inputobject) - 1,並前進至0。它永遠不必以這種方式創建輸入序列的副本,但該技巧只能處理已有長度並支持隨機訪問的內容。

對於你的情況我不使用reversed()反正。你想要的清單作爲輸出,而不是一臺發電機,所以用切片扭轉列表,而不是:

list(el.iterancestors())[::-1] + [1, 2, 3] 

記憶效率是不是一個問題在這裏,因爲你正在建設一個新的列表對象。

相關問題