如何生成分组Python字典的所有组合变体?
生成所有部件组合的通用方案
需求说明
我有一个由字典对象组成的列表的列表,每个嵌套列表对应一类部件的所有可选变体,需要生成包含所有可能部件组合的列表。方案必须满足:
- 通用适配:不能硬编码部件组数量,支持2种及以上部件组的场景
- 灵活可变:每个部件组的变体数量可以任意调整
输入示例
options = [ [ # 座椅部件 {'index': 0, 'name': 'Seat A'}, {'index': 1, 'name': 'Seat B'}, {'index': 2, 'name': 'Seat C'}, {'index': 3, 'name': 'Seat D'}, {'index': 4, 'name': 'Seat E'} ], [ # 桌腿部件 {'index': 0, 'name': 'Legs A'}, {'index': 1, 'name': 'Legs B'}, {'index': 2, 'name': 'Legs C'} ], [ # 靠枕部件 {'index': 0, 'name': 'Pillows A'}, {'index': 1, 'name': 'Pillows B'}, {'index': 2, 'name': 'Pillows C'} ] ]
此示例中,总组合数应为 5×3×3=45 种。
解决方案
方法1:使用标准库itertools.product(推荐)
Python标准库itertools中的product函数专门用于生成多个可迭代对象的笛卡尔积,完全匹配需求,代码简洁高效:
import itertools def generate_variations(options): # 将product返回的元组转换为列表,得到目标格式 return [list(combination) for combination in itertools.product(*options)] # 调用示例 variations = generate_variations(options) print(len(variations)) # 输出45,符合预期
方法2:手动实现笛卡尔积(无依赖)
如果不想依赖标准库,可以通过迭代的方式手动实现笛卡尔积逻辑:
def generate_variations(options): # 初始化结果为包含空列表的列表,作为组合的起点 result = [[]] for part_group in options: temp = [] # 对现有每个组合,添加当前部件组的所有变体 for existing_combo in result: for part in part_group: temp.append(existing_combo + [part]) result = temp return result # 调用示例 variations = generate_variations(options) print(len(variations)) # 输出45,符合预期
结果验证
打印前3个组合,验证格式是否符合要求:
for combo in variations[:3]: print(combo)
输出:
[{'index': 0, 'name': 'Seat A'}, {'index': 0, 'name': 'Legs A'}, {'index': 0, 'name': 'Pillows A'}] [{'index': 0, 'name': 'Seat A'}, {'index': 0, 'name': 'Legs A'}, {'index': 1, 'name': 'Pillows B'}] [{'index': 0, 'name': 'Seat A'}, {'index': 0, 'name': 'Legs A'}, {'index': 2, 'name': 'Pillows C'}]
内容的提问来源于stack exchange,提问作者JokerMartini
相关产品推荐
相关产品推荐

