2012-02-24 7 views
6

मेरे पास एक जनरेटर है जो मैं दो स्तरों पर फिर से शुरू करना चाहता हूं। पहला स्तर असमान रूप से दूरी पर है, तो मैं अगले स्तर को 5 के समूहों में बदलना चाहता हूं। मुझे इसे मेमोरी कुशल होने और जनरेटर इनपुट पर काम करने की आवश्यकता है, इसलिए मैं निम्नलिखित की तरह कुछ कर रहा हूं। मुझे लगता है कि एक बेहतर तरीका हो सकता है? विशेष रूप से, मैं असमान लंबाई परिणामों में पिछली संख्या नहीं चाहता हूं।पायथन में एक खंड आकार अनुक्रम के साथ grouper?

import itertools 

def dynamic_grouper(iterable, intervals): 
    for i in intervals: 
     inner_iter = list(itertools.islice(iterable, i)) # this is a "group" 
     yield inner_iter 

iterable = iter(xrange(100)) 
chunk_sizes = [22,30,38,10] 

for i,group in enumerate(dynamic_grouper(iterable, chunk_sizes)): 
    args = [iter(group)] * 5 
    for item in itertools.izip_longest(fillvalue=None, *args): 
     print "Group %i" % i 
     print "Items %s" % list(item) 

उत्तर

5

None रों बचने के लिए आप chunks इस्तेमाल कर सकते हैं:

def chunks(seq, n): 
    # https://stackoverflow.com/a/312464/190597 (Ned Batchelder) 
    """ Yield successive n-sized chunks from seq.""" 
    for i in xrange(0, len(seq), n): 
     yield seq[i:i + n] 

for i,group in enumerate(dynamic_grouper(iterable, chunk_sizes)): 
    for item in chunks(group, 5): 
     print "Group %i" % i 
     print "Items %s" % list(item) 
+0

धन्यवाद, यह लगता है कि यह काम कर देता है। – jseabold

+0

यदि यह जनरेटर है तो 'len (l)' 'l' पर क्या प्रभाव पड़ता है? क्या वह 'एल' के पूर्ण पढ़ने को मजबूर नहीं करेगा, उदा। 'भाग (file.readlines(), 2)'? – Harvey

+0

'एल' एक सूची है, जनरेटर नहीं। जेनरेटर को 'लेन' लगाने से टाइपएरर बढ़ेगा। ध्यान दें कि 'dynamic_grouper' सूचियां प्रदान कर रहा है, इसलिए ऊपर, 'समूह' एक सूची है। इसलिए 'चंक्स (समूह, 5)' को कॉल करना ठीक है। – unutbu

संबंधित मुद्दे