我知道有可能將生成器轉換爲「低級別」列表(例如list(i for i in xrange(10))
),但是是否可以執行反向而不是首先遍歷列表(例如(i for i in range(10))
)?是否可以將列表類型轉換爲生成器而無需迭代?
編輯:刪除了單詞cast
爲了清楚我想達到的目的。
編輯2:實際上,我想我可能誤解了基本水平的發電機。那會教我在早晨咖啡之前不要發佈SO問題!
我知道有可能將生成器轉換爲「低級別」列表(例如list(i for i in xrange(10))
),但是是否可以執行反向而不是首先遍歷列表(例如(i for i in range(10))
)?是否可以將列表類型轉換爲生成器而無需迭代?
編輯:刪除了單詞cast
爲了清楚我想達到的目的。
編輯2:實際上,我想我可能誤解了基本水平的發電機。那會教我在早晨咖啡之前不要發佈SO問題!
我不知道你的意思,但你鍵入的內容是合法的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
Python文檔的相關鏈接是[here](http://docs.python.org/dev/reference/expressions.html#generator-expressions):「生成器表達式產生一個新的生成器對象。它的語法是與理解相同,除了它被括在圓括號中而不是括號或大括號中。「 – cjerdonek 2012-07-14 23:51:04
您可以通過使用內置的功能list(...)
和迭代出來的拿名單出來迭代器列表使用iter(...)
:
mylist = list(myiterator)
myiterator = iter(mylist)
事實上,你的語法是一個迭代器:
iter_10 = (i for i in range(10))
而不是使用[...]
它給出了一個列表。
看一看這個答案Hidden features of Python
我正在尋找一個較低級別的解決方案,不需要迭代原始列表(例如,在我的示例中爲'range(10)')。 – 2011-05-09 14:08:02
所以,你可以使用'iter(mylist)',它將一個迭代器從你的列表中取出。 – Don 2011-05-09 14:54:00
事實上它可能列表擁有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)
根據'dir(list)','list'在Python 2.7中沒有'next'方法... – 2014-05-03 18:24:26
@NoobSaibot,感謝您的糾正!我已經更新了答案。 – 2014-05-04 08:47:03
你不應該使用這個詞** **投在Python因爲在Python中不存在變量,但這些對象的類型不能改變 – eyquem 2011-05-09 07:57:28
@eyquem - 阿門!你甚至不應該考慮Python中的單詞 - 這些實際上是實例構造函數,從給定的參數中創建一個新的對象,而不是將某個地址的內存重新解釋爲另一種類型。 – PaulMcG 2011-05-09 10:14:13