2012-07-16 28 views
8

Başka bir jeneratörü ya da benzerlerini (başka bir jeneratörü/yineleyici ... olasılıkla sonsuz olarak üretebilen) üretmeyi düzleştiren python işlevinin nasıl yazılacağını bilmek isterim. gen -, gen sonra parantez arasındaki içerik gen verim jeneratör olan veri jeneratör amacı, şu anlama gelir:Python: Başka bir jeneratörü içeren jeneratörü düzleştirmek için fonksiyon

gen(gen(1,2,3), gen(4,5,6), [7,8,9], [gen(10,11,12), gen(13,14,15)])

Not: Burada

örnektir.

"düzleşme" sonra beklenen sonucu: gen(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15)

düzleştirmek işlevi de jeneratörü dönmek için gereklidir! (Aksi takdirde, jeneratörler önceki kullanım anlamsız olurdu).

Sadece ben Python 3.

Teşekkür kullanıyorum, nota!

cevap

12

En kolay yol, yinelemeli düzleştirme işlevidir. Eğer dizeleri hariç her iterable içine inmek isteyen varsayarsak, bu yapabilirdi: Python 3.3 başlayarak

def flatten(it): 
    for x in it: 
     if (isinstance(x, collections.Iterable) and 
      not isinstance(x, str)): 
      for y in flatten(x): 
       yield y 
     else: 
      yield x 

, ayrıca özyinesiz yöntem esasen bir seçemeden olan

def flatten(it): 
    for x in it: 
     if (isinstance(x, collections.Iterable) and 
      not isinstance(x, str)): 
      yield from flatten(x) 
     else: 
      yield x 
+0

Çok teşekkür ederim! Benim girişimi ile senin için çok yakındı :-) Saygılar! – JoshuaBoshi

+0

+1 - Verimden unutamaya devam ediyorum ve bu güzel bir hatırlatmadır. –

+2

@JonClements: Henüz piyasaya sürülmemiş olan bir Python versiyonunun özelliklerini unutmaya devam ediyorsunuz? Şaşırdım. :) –

0

yazabilir Yinelemeli yöntem, bir yığın kullanarak:

def flatten(it): 
    stack = [] 
    it = iter(it) 
    while True: 
     try: 
      x = next(it) 
     except StopIteration: 
      if stack: 
       it = stack.pop() 
       continue 
      else: 
       return 
     if isinstance(x, collections.Iterable) and not isinstance(x, str): 
      stack.append(it) 
      it = iter(x) 
     else: 
      yield x 
İlgili konular