You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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]

逻辑说明

  1. 第一次takewhile(lambda x: x < 12000, gen)会惰性遍历生成器,取出所有连续小于12000的元素,遍历结束后生成器的指针停在第一个大于等于12000的元素位置。
  2. 第二次takewhile(lambda x: x >= 12000, gen)从生成器当前指针位置继续遍历,取出所有连续大于等于12000的元素,直到遇到第一个小于12000的元素时停止。
  3. it.chain将这两部分结果合并为一个序列,转成列表后就是你需要的输出。

这种方式完全利用了itertools的惰性特性和生成器的状态保留,不需要额外循环或重置操作,契合itertools的风格。

内容的提问来源于stack exchange,提问作者njp

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 14:37:16