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

Python如何生成键数可变、for循环层数可变的字典列表

实现方案

不需要手写递归处理可变层数循环,Python标准库itertools.product原生支持多可迭代对象的笛卡尔积生成,和多层嵌套for循环的逻辑完全等价,适配任意数量的字典键场景。

等价原有逻辑的实现

你之前固定2个键的写法,可以改成如下通用形式:

from itertools import product

# 键与对应候选值的配置,键的数量可自由调整
key_candidates = {
    'cHW': [-1.5, -0.8],
    'cHWtil': [-1.5, -0.8]
}

base_points = [
    dict(zip(key_candidates.keys(), comb))
    for comb in product(*key_candidates.values())
]

运行后输出和你原有代码完全一致:

[{'cHW': -1.5, 'cHWtil': -1.5},
 {'cHW': -1.5, 'cHWtil': -0.8},
 {'cHW': -0.8, 'cHWtil': -1.5},
 {'cHW': -0.8, 'cHWtil': -0.8}]

可变键适配方式

你只需要增删key_candidates字典里的键值对即可,不需要修改核心生成逻辑。比如新增第三个键cNew,候选值为[0, 1],直接修改配置:

key_candidates = {
    'cHW': [-1.5, -0.8],
    'cHWtil': [-1.5, -0.8],
    'cNew': [0, 1]
}

代码会自动生成3层循环对应的8种组合,无需手动加for循环层级。

手写递归实现(无依赖场景用)

如果受限不能用标准库,可以用简单的递归逻辑实现,核心思路是逐键处理,拼接当前键的所有候选值和后续键的组合结果:

def gen_dict_combinations(key_value_map):
    keys = list(key_value_map.keys())
    def backtrack(current_idx):
        if current_idx == len(keys):
            return [{}]
        current_key = keys[current_idx]
        combinations = []
        for rest_part in backtrack(current_idx + 1):
            for val in key_value_map[current_key]:
                current_comb = rest_part.copy()
                current_comb[current_key] = val
                combinations.append(current_comb)
        return combinations
    return backtrack(0)

# 调用示例
base_points = gen_dict_combinations({
    'cHW': [-1.5, -0.8],
    'cHWtil': [-1.5, -0.8]
})

该实现效果和itertools版本完全一致,同样支持任意数量的键配置。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 07:27:22