2011-05-09 48 views
20

我知道有可能將生成器轉換爲「低級別」列表(例如list(i for i in xrange(10))),但是是否可以執行反向而不是首先遍歷列表(例如(i for i in range(10)))?是否可以將列表類型轉換爲生成器而無需迭代?

編輯:刪除了單詞cast爲了清楚我想達到的目的。

編輯2:實際上,我想我可能誤解了基本水平的發電機。那會教我在早晨咖啡之前不要發佈SO問題!

+4

你不應該使用這個詞** **投在Python因爲在Python中不存在變量,但這些對象的類型不能改變 – eyquem 2011-05-09 07:57:28

+2

@eyquem - 阿門!你甚至不應該考慮Python中的單詞 - 這些實際上是實例構造函數,從給定的參數中創建一個新的對象,而不是將某個地址的內存重新解釋爲另一種類型。 – PaulMcG 2011-05-09 10:14:13

回答

39

試試這個:an_iterator = iter(a_list) ... docs here。那是你要的嗎?

+12

提問者詢問將列表轉換爲生成器。 'iter()'返回一個不是生成器的迭代器。 – cjerdonek 2012-07-14 23:52:29

4

我不知道你的意思,但你鍵入的內容是合法的Python代碼:

>>> x = (i for i in range(10)) 
>>> x 
<generator object at 0xb7f05f6c> 
>>> for i in x: print i 
0 
1 
2 
3 
4 
5 
6 
7 
8 
9 
+2

Python文檔的相關鏈接是[here](http://docs.python.org/dev/reference/expressions.html#generator-expressions):「生成器表達式產生一個新的生成器對象。它的語法是與理解相同,除了它被括在圓括號中而不是括號或大括號中。「 – cjerdonek 2012-07-14 23:51:04

15

您可以通過使用內置的功能list(...)和迭代出來的拿名單出來迭代器列表使用iter(...)

mylist = list(myiterator) 
myiterator = iter(mylist) 

事實上,你的語法一個迭代器:

iter_10 = (i for i in range(10)) 

而不是使用[...]它給出了一個列表。

看一看這個答案Hidden features of Python

+0

我正在尋找一個較低級別的解決方案,不需要迭代原始列表(例如,在我的示例中爲'range(10)')。 – 2011-05-09 14:08:02

+1

所以,你可以使用'iter(mylist)',它將一個迭代器從你的列表中取出。 – Don 2011-05-09 14:54:00

3

事實上它可能列表擁有Iterator接口:

list_iter = list.__iter__() # or iter(list), returns list iterator 
list_iter.__next__() # list_iter.next() for python 2.x 

所以,

lst_iter = iter(lst) 

的伎倆。

儘管使用理解並使其生成器更有意義,例如:

lst_iter_gt_10 = (item for item in lst if item > 10) 
+0

根據'dir(list)','list'在Python 2.7中沒有'next'方法... – 2014-05-03 18:24:26

+0

@NoobSaibot,感謝您的糾正!我已經更新了答案。 – 2014-05-04 08:47:03

相關問題