6

我有一个生成器,我想在两个级别上进行迭代。第一级间隔不均匀,然后我想将下一个级别分成 5 个组,比如说。我需要它具有内存效率并处理生成器输入,所以我正在做类似以下的事情。我不得不认为可能有更好的方法?特别是,我不希望在不均匀长度结果中出现尾随无。

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

1 回答 1

5

为了避免Nones,你可以使用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)
于 2012-02-24T16:35:03.613 回答