Python多字典全组合生成、自动计算及结果查重实现方法咨询
Python 多字典组合计算与结果标记实现方案
1. 生成所有字典键值对的组合
用itertools.product处理多字典的笛卡尔积,这是应对任意数量字典的通用方案:
import itertools # 示例字典集合(可扩展任意数量、任意键数的字典) dict_list = [ {"A0": 1, "A1": 2}, {"B0": 2, "B1": 1} ] # 将每个字典的键值对转为列表,供笛卡尔积计算 dict_items = [list(d.items()) for d in dict_list] # 生成所有组合,每个元素是元组,包含各字典选出来的一组键值对 all_combinations = list(itertools.product(*dict_items))
2. 对组合执行自定义计算(以平均值为例)
封装计算逻辑,遍历所有组合完成计算,同时保存组合的关键信息:
def calculate_average(combination): # 提取组合中的所有数值 values = [item[1] for item in combination] return sum(values) / len(values) # 存储每个组合的索引、键名、数值、计算结果 combination_results = [] for idx, combo in enumerate(all_combinations): avg = calculate_average(combo) combo_keys = [item[0] for item in combo] combo_values = [item[1] for item in combo] combination_results.append({ "index": idx, "combo_keys": combo_keys, "combo_values": combo_values, "result": avg })
如果需要其他计算(求和、加权平均等),直接修改calculate_average函数即可
3. 标记结果相同的项
通过字典分组结果,再为每个组合标记出结果相同的其他组合索引:
# 按计算结果分组(用round处理浮点数精度误差) result_groups = {} for item in combination_results: rounded_res = round(item["result"], 6) if rounded_res not in result_groups: result_groups[rounded_res] = [] result_groups[rounded_res].append(item) # 为每个组合添加相同结果的标记 for res, items in result_groups.items(): if len(items) > 1: same_indices = [item["index"] for item in items] for item in items: item["same_as"] = [idx for idx in same_indices if idx != item["index"]] else: items[0]["same_as"] = [] # 打印最终结果 for item in combination_results: print(f"组合{item['index']}: 键={item['combo_keys']}, 值={item['combo_values']}, 平均值={item['result']}, 相同结果的组合={item['same_as']}")
示例运行输出
组合0: 键=['A0', 'B0'], 值=[1, 2], 平均值=1.5, 相同结果的组合=[3] 组合1: 键=['A0', 'B1'], 值=[1, 1], 平均值=1.0, 相同结果的组合=[] 组合2: 键=['A1', 'B0'], 值=[2, 2], 平均值=2.0, 相同结果的组合=[] 组合3: 键=['A1', 'B1'], 值=[2, 1], 平均值=1.5, 相同结果的组合=[0]
扩展提示
- 若字典数量/键数量过大,建议用生成器遍历
itertools.product(不转成列表),避免内存溢出 - 浮点数精度要求高时,可替换
round为decimal模块做精确计算
内容的提问来源于stack exchange,提问作者tva221
相关产品推荐
相关产品推荐

