2013-04-16 4 views
9

сказать, у меня есть списокPython: преобразовать список в генератор

data = [] 
    data.append("A") 
    data.append("B") 
    data.append("C") 
    data.append("D") 

Как преобразовать этот к типу генератора? Любая помощь с кодом образца высоко ценится ...

Обнаружили URL http://eli.thegreenplace.net/2012/04/05/implementing-a-generatoryield-in-a-python-c-extension/

Это то, что я хочу сделать?

+0

google keyword 'yield' – yedpodtrzitko

ответ

2
import itertools 
iter_data = itertools.chain(data) 

так:

In [10]: data 
Out[10]: [1, 2, 3, 4, 5, 6, 7, 8, 9] 

In [11]: iter_data=itertools.chain(data) 

In [12]: iter_data 
Out[12]: <itertools.chain at 0x1ce8950> 

In [13]: iter_data.next() 
Out[13]: 1 
+5

FWIW, это ничем не отличается от 'iter_data = iter (data)' ... Вы на самом деле ничего не цепляете. – mgilson

+1

ничего не цепляется? нельзя иметь единственную цепочку ссылок? ;-) –

1
>>> d = ['A', 'B', 'C', 'D'] 
>>> 
>>> def gen(d): 
...  for i in d: 
...    yield i 
... 
>>> for i in gen(d): 
...  print i 
... 
A 
B 
C 
D 
>>> 
6

Буквальный эквивалент будет:

def data_generator(): 
    yield 'A' 
    yield 'B' 
    yield 'C' 
    yield 'D' 

Вызов функции генератора возвращает генератора-итератора. Передача генератор-итератор в конструктор списка дает:

>>> list(data_generator()) 
['A', 'B', 'C', 'D'] 

Этот генератор-итератор может быть создан с помощью выражения генератора:

data_iter = (c for c in 'ABCD') 

Примечания: Вы заполнили свой список с четыре добавить заявления , Обычно это не то, как вы его напишете.

Скорее сделать:

data = ['A', 'B', 'C', 'D'] 
1

Вы имеете в виду что-то вроде этого?

def gen(): 
    for x in "ABCD": 
     yield x 

In [9]: it=gen() 

In [10]: next(it) 
Out[10]: 'A' 

In [11]: next(it) 
Out[11]: 'B' 

In [12]: next(it) 
Out[12]: 'C' 

In [13]: next(it) 
Out[13]: 'D' 
13
>>> (n for n in [1,2,3,5]) 
<generator object <genexpr> at 0x02A52940> 

работает в Python 2.7.4+

>>> a2g = lambda x : (n for n in x) 
>>> a2g([1,2,3,4,5]) 
<generator object <genexpr> at 0x02A57CD8> 

Edit:

Еще одно небольшое изменение лямбда-генератора фабричной модели

>>> a2g = lambda *args: (n for n in args) 
>>> for i in a2g(1,2,3,4, 5): print i 

1 
2 
3 
4 
5 
0
(item for item in listNameHere).next() 

Это общий способ сделать это, если я правильно помню.

>>> a = [0,1,2,3,4] 
>>> x = (item for item in a) 
>>> x 
<generator object <genexpr> at 0x028B8440> 
>>> x.next() 
0 
>>> x.next() 
1 
>>> x.next() 
2 

и т.д. и т.п.

9

Вы уверены, что вы хотите создать генератор? Генератор - это функция, которая возвращает тип итератора, созданный, например. используя ключевое слово yield (см. term-generator). Если вы действительно хотите этого, ответ steven-rumbalski «s именно то, что вы ищете:

data_gen = (y for y in data) 

Большую часть времени, вы хотите, чтобы непосредственно создать iterator объект, например, для использования метода next().В этом случае ответ подразумевается в комментарии по mgilson выше:

data_iter = iter(data) 

что эквивалентно data_iter = data.__iter__(), ср functions#iter.

Смежные вопросы