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

如何根据字典中子字典数量动态生成嵌套for循环创建组合列表?

动态生成多维度组合列表的解决方案

原始实现代码

variations = {
    'size':{'small':'Small',
            'medium':'Medium', 
            'large':'Large'}, 
    'quantity':{'20l':'20l',
                '10l':'10l',
                '5l':'5l'},
    'color':{'red':'Red',
             'blue':'Blue',
             'green':'Green'}
}

var_list = [[i,j,k] for i in variations['color'] for j in variations['size'] for k in variations['quantity']]

等价的普通循环写法

var_list = []

for i in variations['color']:
  for j in variations['size']:
    for k in variations['quantity']:
      comb = []
      comb.append(i)
      comb.append(j)
      comb.append(k)
      var_list.append(comb)

输出结果

两种写法生成的var_list结果完全一致:

[['red', 'small', '20l'], ['red', 'small', '10l'], ['red', 'small', '5l'], ['red', 'medium', '20l'], ['red', 'medium', '10l'], ['red', 'medium', '5l'], ['red', 'large', '20l'], ['red', 'large', '10l'], ['red', 'large', '5l'], ['blue', 'small', '20l'], ['blue', 'small', '10l'], ['blue', 'small', '5l'], ['blue', 'medium', '20l'], ['blue', 'medium', '10l'], ['blue', 'medium', '5l'], ['blue', 'large', '20l'], ['blue', 'large', '10l'], ['blue', 'large', '5l'], ['green', 'small', '20l'], ['green', 'small', '10l'], ['green', 'small', '5l'], ['green', 'medium', '20l'], ['green', 'medium', '10l'], ['green', 'medium', '5l'], ['green', 'large', '20l'], ['green', 'large', '10l'], ['green', 'large', '5l']]

问题需求

当前实现依赖固定层数的循环,无法适配variations中子字典数量的变化。比如新增brand子字典后,需要手动修改代码增加一层循环:

var_list = [[i,j,k,l] for i in variations['color'] for j in variations['size'] for k in variations['quantity'] for l in variations['brand']]

需要实现循环层数随variations中子字典数量自动增减的效果。

解决方案

利用Python标准库itertools中的product()方法即可实现动态生成所有维度的笛卡尔积,无需手动维护循环层数:

核心代码实现

import itertools

variations = {
    'size':{'small':'Small', 'medium':'Medium', 'large':'Large'}, 
    'quantity':{'20l':'20l', '10l':'10l', '5l':'5l'},
    'color':{'red':'Red', 'blue':'Blue', 'green':'Green'}
}

# 按需要的顺序提取各维度的可选值列表
dimensions = [variations['color'], variations['size'], variations['quantity']]
# 计算笛卡尔积并转换为列表格式
var_list = [list(comb) for comb in itertools.product(*dimensions)]

适配新增维度的情况

当variations中新增子字典(比如brand)时,只需将新维度加入dimensions列表即可,循环逻辑无需改动:

# 新增brand维度
variations['brand'] = {'a':'Brand A', 'b':'Brand B'}
# 更新维度列表
dimensions = [variations['color'], variations['size'], variations['quantity'], variations['brand']]
# 自动生成包含新维度的组合列表
var_list = [list(comb) for comb in itertools.product(*dimensions)]

注意事项

  • 如果不需要固定维度顺序,可直接用dimensions = list(variations.values()),但需注意Python 3.7及以上版本才会保留字典的插入顺序
  • itertools.product()返回的是元组,用list(comb)转换后即可和原始代码的输出格式完全匹配

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 10:15:45