如何提取值为列表的字典的所有可能唯一采样组合?
问题描述
给定字典:
d = {'a': ['A', 'B', 'C'], 'b': ['A', 'B', 'C'], 'c': ['D', 'E'], 'd': ['E', 'F', 'G']}
需要生成所有可能的唯一采样结果,每个结果是一个字典,其中每个键对应原字典中对应列表的一个元素。例如:
{'a': 'A', 'b': 'B', 'c': 'D', 'd': 'E'}
或
{'a': 'B', 'b': 'A', 'c': 'E', 'd': 'F'}
实现方法
可以用Python标准库中的itertools.product来解决,它能生成多个可迭代对象的笛卡尔积,正好匹配每个键的取值组合需求。
具体步骤:
- 提取原字典的键列表,保证后续组合的键顺序一致
- 按键的顺序提取对应的取值列表,组成可迭代对象集合
- 用
itertools.product生成所有可能的取值组合 - 将每个组合与键列表配对,转换成目标字典格式
示例代码:
import itertools original_dict = {'a': ['A', 'B', 'C'], 'b': ['A', 'B', 'C'], 'c': ['D', 'E'], 'd': ['E', 'F', 'G']} # 获取键集合和对应取值列表 keys = list(original_dict.keys()) value_groups = [original_dict[key] for key in keys] # 生成所有取值组合的笛卡尔积 all_combinations = itertools.product(*value_groups) # 转换为字典列表 result_dicts = [dict(zip(keys, combo)) for combo in all_combinations] # 打印前5个结果示例 for idx, item in enumerate(result_dicts[:5], 1): print(f"第{idx}个结果: {item}")
运行后输出的前5个结果示例:
第1个结果: {'a': 'A', 'b': 'A', 'c': 'D', 'd': 'E'} 第2个结果: {'a': 'A', 'b': 'A', 'c': 'D', 'd': 'F'} 第3个结果: {'a': 'A', 'b': 'A', 'c': 'D', 'd': 'G'} 第4个结果: {'a': 'A', 'b': 'A', 'c': 'E', 'd': 'E'} 第5个结果: {'a': 'A', 'b': 'A', 'c': 'E', 'd': 'F'}
最终会生成3×3×2×3=54个唯一的字典结果,完全覆盖所有可能的采样组合。
内容的提问来源于stack exchange,提问作者Federico Livi
相关产品推荐
相关产品推荐

