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

如何在Python/SageMath中高效实现字典网格生成函数GridGen?

更优实现GridGen函数的方案

需求回顾

需要实现GridGen函数,生成变量取值的笛卡尔积对应的字典列表,示例如下:

GridGen([a], -1, 1) --> [{a: -1}, {a: 0}, {a: 1}]  # 注:原示例最后一个值笔误,应为1
GridGen([a, b], -1, 1) --> [{a: -1, b: -1}, {a: 0, b: -1}, {a: 1, b: -1},
                            {a: -1, b: 0}, {a: 0, b: 0}, {a: 1, b: 0}, 
                            {a: -1, b: 1}, {a: 0, b: 1}, {a: 1, b: 1}]
GridGen([a,b,c], -1, 1) --> [{a: -1, b: -1, c: -1}, {a: 0, b: -1, c: -1}, ...]

现有实现问题

你当前的递归实现存在两个明显问题:

  1. TensorMergeDict的else分支仅打印结果但未返回,会导致最终返回None;
  2. 递归逻辑效率较低,且代码冗余,不如直接利用现成的笛卡尔积工具。

更优实现方案

方案1:Python标准库itertools.product(推荐)

Python标准库的itertools.product是专门生成笛卡尔积的工具,底层为C实现,效率远高于手写递归。代码简洁直观:

import itertools

def GridGen(vars, minV, maxV, step=1):
    # 生成每个变量的取值范围
    value_ranges = [range(minV, maxV + 1, step) for _ in vars]
    # 生成所有取值组合并转为字典列表
    return [dict(zip(vars, values)) for values in itertools.product(*value_ranges)]

如果需要节省内存(比如变量多、取值范围大),可以改为生成器版本:

import itertools

def GridGen(vars, minV, maxV, step=1):
    value_ranges = [range(minV, maxV + 1, step) for _ in vars]
    for values in itertools.product(*value_ranges):
        yield dict(zip(vars, values))

方案2:SageMath专属CartesianProduct

SageMath内置了CartesianProduct类,也可以直接用来实现:

from sage.sets.cartesian_product import CartesianProduct

def GridGen(vars, minV, maxV, step=1):
    value_sets = [range(minV, maxV + 1, step) for _ in vars]
    # 生成笛卡尔积集合
    cartesian_product = CartesianProduct(*value_sets)
    # 转换为目标字典列表
    return [dict(zip(vars, elem)) for elem in cartesian_product]

方案优势

  • 效率更高:itertools.product和Sage的CartesianProduct都是经过优化的底层实现,比手写递归快得多;
  • 代码简洁:无需维护递归逻辑,一行核心代码即可完成笛卡尔积生成;
  • 可靠性强:避免了手写递归可能出现的逻辑错误(比如原实现的返回值缺失问题)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 15:20:52