如何在不将可迭代转换为字典的情况下制作任务?



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

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

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

变量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))

我为你写这个。当我完成时,我发现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))

代码不转换为字典。

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

相关内容

最新更新