如何根据字典中子字典数量动态生成嵌套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
相关产品推荐
相关产品推荐

