0

该函数为此对象创建一个生成器。流生成器必须等于原始流。

gen = gen_stream (9, [(4,111), (7,12)])

list (gen) [0, 0, 0, 0, 111, 0, 0, 12, 0]

代码:

from itertools import count

def gen_stream(total, sorted_iterable, extractor=lambda x: x):
    sorted_iterable = dict(map(extractor, sorted_iterable))
    iterable = count() if total is None else range(total)
    for i in iterable:
        yield sorted_iterable.get(i, 0)

#gen = gen_stream(9,[(4,111),(7,12)])
#list(gen)

输出:

[0, 0, 0, 0, 111, 0, 0, 12, 0]

现在的问题是:如何在不将可迭代转换为字典的情况下完成任务?据我了解:

sorted_iterable = dict(map(extractor, sorted_iterable))
4

3 回答 3

0

我为你写这个。当我完成时,我发现alaniwi 已经回答了你的问题。-_- 所以这只是个人意见,仅供参考。

from itertools import count


def gen_stream(total, sorted_iterable, extractor=lambda x: x):
    sorted_iterator = iter(sorted_iterable)  # transform to iterator
    iterable = count() if total is None else range(total)
    try:  # get first value
        current_extracted_record = extractor(next(sorted_iterator))
    except StopIteration:
        current_extracted_record = None
    for i in iterable:
        if current_extracted_record:
            if i == current_extracted_record[0]:
                try:  # get next value
                    yield current_extracted_record[1]
                    current_extracted_record = extractor(next(sorted_iterator))
                except StopIteration:
                    current_extracted_record = None
            else:
                yield 0
        else:
            yield 0


if __name__ == "__main__":
    gen = gen_stream(9, [(4, 111), (7, 12)])

    print(list(gen))
于 2020-06-30T06:33:43.047 回答
0

这将通过循环索引并在需要时从可迭代的输入中一次读取一个元素来完成所有工作,这样如果输入是由某个生成器生成的,您就不会不必要地将其全部存储在内存中。

该变量包含我们将要使用next_input的下一对。(position, value)

def gen_stream(total, sorted_iterable, extractor=lambda x: x):

    if not hasattr(sorted_iterable, '__next__'):
        sorted_iterable = iter(sorted_iterable)

    input_finished = False
    next_input = ()
    for i in range(total):
        if (not input_finished and
            (next_input == () or i > next_input[0])):
            try:
                next_input = next(sorted_iterable)
            except StopIteration:
                input_finished = True
        if input_finished or next_input[0] > i:
            yield 0
        else:
            yield extractor(next_input[1])
    
gen = gen_stream(9, [(4,111), (7,12)])
print(list(gen))
于 2020-06-30T06:03:42.407 回答
0

无需转换为 dict 的代码。

from itertools import count 

def gen_stream(total, sorted_iterable, extractor=lambda x: x):
    iterable = count() if total is None else range(total)
    for i in iterable:
        for j in sorted_iterable:
            j = extractor(j)
            if i == j[0]:
                yield j[1]
                break
        else:
            yield 0
于 2020-10-30T11:55:44.907 回答