Подтвердить что ты не робот

Можно ли преобразовать тип списка в генератор без повторения?

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

Изменить: удалено слово cast для ясности в том, чего я пытаюсь достичь.

Изменить 2: На самом деле, я думаю, что я, возможно, неправильно понял генераторов на фундаментальном уровне. Это научит меня не ставить вопросы SO перед утренним кофе!

4b9b3361

Ответ 1

Попробуйте следующее: an_iterator = iter(a_list)... docs here. Это то, что вы хотите?

Ответ 2

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

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

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

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

вместо [...], который дает список.

Посмотрите на этот ответ Скрытые функции Python

Ответ 3

Я не уверен, что вы имеете в виду, но то, что вы набрали, является допустимым кодом 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

Ответ 4

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

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)