You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 02:57:14