在python3中从惰性生成器获取N个项目的简洁方法?
我有一个懒惰的生成器,我想把N个项目放在一个列表中。有没有一种简洁的方式(类似于列表理解风格)不使用for循环并手动将每个项目追加到列表中 我的问题与提出的重复问题不同,因为它涉及生成器(并且不能分割生成器),并且有一个必须满足的条件 这就是我现在正在做的:在python3中从惰性生成器获取N个项目的简洁方法?,python,generator,Python,Generator,我有一个懒惰的生成器,我想把N个项目放在一个列表中。有没有一种简洁的方式(类似于列表理解风格)不使用for循环并手动将每个项目追加到列表中 我的问题与提出的重复问题不同,因为它涉及生成器(并且不能分割生成器),并且有一个必须满足的条件 这就是我现在正在做的: my_list = [] counter = 0 for item in my_generator(): if counter == 10: break
my_list = []
counter = 0
for item in my_generator():
if counter == 10:
break
if condition(item):
my_list.append(item)
counter += 1
使用
itertools.islice()
函数的简短解决方案:
my_list = list(itertools.islice(my_generator, 0, 10))
可能有点难看,但使用列表理解从生成器中获取n个项目,然后在外部列表理解中过滤并递归
def takeN(gen, func, n, items=list()):
if len(items) == n:
return items
return takeN(gen, func, n,
items + [fgen
for fgen in [next(gen) for i in range(n-len(items))]
if func(fgen) == True])
my_gen = (i for i in range(1,100))
takeN(my_gen, lambda x: x%3 == 0, 7)
Out[89]: [3, 6, 9, 12, 15, 18, 21]
takeN(my_gen, lambda x: x%3 == 0, 7)
Out[90]: [24, 27, 30, 33, 36, 39, 42]
takeN(my_gen, lambda x: x%2 == 0, 12)
Out[91]: [44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66]
我想尝试递归,但非递归可能更快:
def takeN(gen, func, n):
items=list()
while len(items) != n:
items += [fgen for fgen in [next(gen) for i in range(n-len(items))]
if func(fgen) == True]
return items
由于物品添加的条件不同,我有一个生成器,而不是列表input@Chris_Rands不是链接的副本,这要求通过条件函数进行筛选,只取第一个匹配的n