Python暴力枚举字典列表元素求和匹配目标值实现方法
暴力枚举组合求和实现方案
核心思路
不需要手写固定层数的嵌套循环,使用Python标准库itertools.product即可自动生成任意数量列表的全量组合(笛卡尔积),天然适配不同键数量、不同列表长度的字典结构,无需硬编码固定键名。
实现时需注意两个细节:
- 测试数据均为浮点数,直接使用
==判断求和结果与目标值是否相等会出现浮点精度误差,需通过「求和结果与目标值的差值绝对值小于指定精度阈值」的方式判断匹配 - Python 3.7及以上版本字典默认保留键的插入顺序,
itertools.product的迭代规则为:传入顺序越靠前的列表,元素迭代速度越慢;传入顺序越靠后的列表,元素迭代速度越快,可根据需要的遍历优先级调整列表传入顺序
完整代码
import itertools def find_matched_combo(data_dict: dict, target_sum: float, precision: float = 1e-6) -> dict: # 提取字典的键序列和对应的值列表,遵循字典原有键顺序 keys = list(data_dict.keys()) value_groups = [data_dict[key] for key in keys] # 逐一枚举所有组合 for value_combo in itertools.product(*value_groups): # 精度判断是否命中目标值 if abs(sum(value_combo) - target_sum) < precision: # 组装为键值对结果返回,命中即返回首个有效解 return dict(zip(keys, value_combo)) # 业务场景下必有解,此处为兜底异常 raise RuntimeError("未找到符合求和规则的组合") # 测试验证 if __name__ == "__main__": test_data = {'x': [11909.0, 9040.0], 'y': [4345.0, 1807.0, 1247.0, 0.0, 6152.0, 4222.0, 123.0], 'w': [538.0, 12.0, 526.0, 0.0, 242.0, 1.0, 128.0, 155.0], 'z': [7149.0, 3003.0, 4146.0, 3054.0, 0.0, -51.0, 1010.0, 189.0, 182.0, -1493.0, 5409.0, -1151.0]} target = 9036 print(find_matched_combo(test_data, target))
运行结果
执行上述测试代码,输出结果为:
{'x': 9040.0, 'y': 1247.0, 'w': 242.0, 'z': -1493.0}
与预期有效解完全一致。
内容的提问来源于stack exchange,提问作者JPWilson
相关产品推荐
相关产品推荐

