首页 > 解决方案 > 在 python 中使用 enumerate() 和 takewhile() 返回一个列表

问题描述

我正在尝试定义一种方法来使用 enumerate() 和 takewhile() 返回斐波那契生成器的前 n 个元素的列表。我的代码进入了一个无限循环,并且从不检查 takewhile() 中的条件以停止迭代。我知道 islice() 更容易,但我需要仅使用 enumerate 和 takewhile 来定义方法。

from itertools import takewhile


def fibonacci_unbounded():
    (a, b) = (0, 1)
    while True:
        yield a
        (a, b) = (b, a + b)


def take_e(n, gen):
    fib_list = []
    for (i, elem) in enumerate(gen):
        if takewhile(i < n, gen):
            fib_list.append(elem)
        else:
            return fib_list


fibonacci = fibonacci_unbounded
n = 8

print(take_e(n, fibonacci()))

标签: pythongeneratoritertools

解决方案


zip就像enumerate你使用range迭代器时一样。好的部分是zip在最短的迭代中停止。所以放弃takewhile并使用在正确位置停止的枚举器。

def fibonacci_unbounded():
    (a, b) = (0, 1)
    while True:
        yield a
        (a, b) = (b, a + b)

def take_e(n, gen):
    return list((elem) for _,elem in zip(range(n), gen))

fibonacci = fibonacci_unbounded
n = 8
print(take_e(n, fibonacci()))

如果使用takewhileandenumerate是一项要求,则应从枚举中获取值,直到满足条件。

from itertools import takewhile

def fibonacci_unbounded():
    (a, b) = (0, 1)
    while True:
        yield a
        (a, b) = (b, a + b)

def take_e(n, gen):
    return list(val for _,val in takewhile(
        lambda i_val: i_val[0] < n, enumerate(gen)))

fibonacci = fibonacci_unbounded
n = 8
print(take_e(n, fibonacci()))

推荐阅读