python - 在 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()))
解决方案
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()))
如果使用takewhile
andenumerate
是一项要求,则应从枚举中获取值,直到满足条件。
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()))
推荐阅读
- javascript - 将初始值设置为 Angular 表单组以进行测试
- python - 使用python的龙与地下城游戏中的问题
- jquery - 单击该链接未以颜色突出显示的菜单
- c# - 通过类名直接访问成员
- c++ - 覆盖或更改 DLL 中连接字符串的提供者名称以进行 TLS 1.2 升级
- function - 如何避免将大量参数传递给嵌套函数?
- android - 将数据从 Android 设备发送到 RaspberryPi
- angular - Angular 6 Material Stepper mat-step 嵌套反应形式
- here-api - HERE 地图:更改集群层的可见性
- java - 尝试查找 java 列表对象是否具有元素 STRING 或 INT?