2013-04-16 26 views
9

BenPython: dönüştürmek liste jeneratöre

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

Nasıl bir jeneratör tipine bu bir dönüştürebilirim bir liste var ki? son derece takdir edilen bir örnek kodla Herhangi bir yardım ...

bir URL http://eli.thegreenplace.net/2012/04/05/implementing-a-generatoryield-in-a-python-c-extension/

ben ne yapmak istediğinizi mi buldunuz? şöyle

+0

google anahtar kelimesi 'verim' – yedpodtrzitko

cevap

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, bu, iter_data = iter (data) 'dan farklı değildir ... Aslında burada hiçbir şeyi zincirlemiyorsunuz. – mgilson

+1

hiçbir şeyi zincirlemiyor mu? tek bir bağlantı zinciri olamaz? ;-) –

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

değişmez eşdeğer olacaktır: Jeneratör işlevinin çağrılması

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

bir jeneratör-yineleyici döndürür. Liste kurucusuna jeneratör-yineleyici Geçme verir:

data_iter = (c for c in 'ABCD') 

Not: Bu jeneratör-yineleyici ayrıca jeneratör ifade kullanılarak oluşturulabilir

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

Dört ifadeleri eklemek Listenizi doldurdu . Bu tipik olarak nasıl yazacağınız değil.

Aksine yapın:

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

Böyle bir şey demek? Python

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> 

eserler 2.7.4+

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

Düzenleme: Bir lambda jeneratör fabrikası desen

>>> 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() 
ait

Bir daha hafif varyasyon 0

Doğru hatırlıyorsam, bunu yapmanın genel yolu budur.

>>> 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 

vs vs

9

size jeneratör oluşturmak istiyorum, emin misiniz? Bir jeneratör, örn. yield anahtar sözcüğünü kullanarak (bkz. term-generator). Çoğu zaman

data_gen = (y for y in data) 

, istediğiniz olacak

doğrudan örneğin bir iterator nesne oluşturmak için: Bunu gerçekten istiyor ise , steven-rumbalski 'ın cevabı aradığınız şeydir next() yöntemini kullanmak için. data_iter = data.__iter__() eşdeğerdir

data_iter = iter(data) 

, krş: Bu durumda, cevap yukarıdaki mgilson tarafından yorumda örtülü olduğu functions#iter.