Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在python3中从惰性生成器获取N个项目的简洁方法?_Python_Generator - Fatal编程技术网

在python3中从惰性生成器获取N个项目的简洁方法?

在python3中从惰性生成器获取N个项目的简洁方法?,python,generator,Python,Generator,我有一个懒惰的生成器,我想把N个项目放在一个列表中。有没有一种简洁的方式(类似于列表理解风格)不使用for循环并手动将每个项目追加到列表中 我的问题与提出的重复问题不同,因为它涉及生成器(并且不能分割生成器),并且有一个必须满足的条件 这就是我现在正在做的: my_list = [] counter = 0 for item in my_generator(): if counter == 10: break

我有一个懒惰的生成器,我想把N个项目放在一个列表中。有没有一种简洁的方式(类似于列表理解风格)不使用for循环并手动将每个项目追加到列表中

我的问题与提出的重复问题不同,因为它涉及生成器(并且不能分割生成器),并且有一个必须满足的条件

这就是我现在正在做的:

    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