Можно ли преобразовать тип списка в генератор без итераций? - PullRequest
32 голосов
/ 09 мая 2011

Я знаю, что можно преобразовать генераторы в списки на «низком уровне» (например, list(i for i in xrange(10))), но возможно ли сделать обратное без предварительной итерации по списку (например . (i for i in range(10)))?

Редактировать: убрал слово cast для ясности в том, что я пытаюсь достичь.

Редактировать 2: На самом деле, я думаю, что у меня могут быть неправильно поняты генераторы на фундаментальном уровне. Это научит меня не оставлять ТАК вопросы перед моим утренним кофе!

Ответы [ 4 ]

49 голосов
/ 09 мая 2011

Попробуйте: an_iterator = iter(a_list) ... документы здесь . Это то, что вы хотите?

14 голосов
/ 09 мая 2011

Вы можете извлечь список из итератора, используя встроенную функцию list(...), и итератор из списка, используя iter(...):

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

Действительно, ваш синтаксис is итератор:

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

вместо использования [...], который дает список.

Посмотрите на этот ответ Скрытые возможности Python

7 голосов
/ 09 мая 2011

Действительно, возможно, список обладает интерфейсом итератора:

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)
4 голосов
/ 09 мая 2011

Я не уверен, что вы имеете в виду, но то, что вы ввели, является действительным кодом 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...