如何用itertools链式组合takewhile操作筛选目标序列?
用itertools优雅组合序列筛选逻辑
可以通过itertools.chain配合两次itertools.takewhile实现,完全符合itertools风格且不会重置生成器,一行核心代码就能搞定:
import itertools as it def lcg(a=75,c=74,m=2**16+1,x0 = 1): xn = x0 yield xn while True: xn = (a*xn+c) % m yield xn # 仅实例化一次生成器(不重置) gen = lcg() # 组合两次takewhile操作得到目标序列 result = list(it.chain(it.takewhile(lambda x: x < 12000, gen), it.takewhile(lambda x: x >= 12000, gen))) print(result) # 输出: [1, 149, 11249, 57305, 38044, 35283, 24819, 26463, 18689, 25472]
逻辑说明
- 第一次
takewhile(lambda x: x < 12000, gen)会惰性遍历生成器,取出所有连续小于12000的元素,遍历结束后生成器的指针停在第一个大于等于12000的元素位置。 - 第二次
takewhile(lambda x: x >= 12000, gen)从生成器当前指针位置继续遍历,取出所有连续大于等于12000的元素,直到遇到第一个小于12000的元素时停止。 it.chain将这两部分结果合并为一个序列,转成列表后就是你需要的输出。
这种方式完全利用了itertools的惰性特性和生成器的状态保留,不需要额外循环或重置操作,契合itertools的风格。
内容的提问来源于stack exchange,提问作者njp
相关产品推荐
相关产品推荐

