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

使用itertools.combinations如何获取首个匹配值组合对应的ID

问题根因

原有代码仅对EUR金额列生成组合,组合生成阶段就丢弃了和金额绑定的唯一ID字段,因此匹配到符合求和要求的组合后,无法关联回对应的ID信息。

修复实现

不要单独提取金额列做组合,直接对「ID+金额」的元组集合生成组合,求和校验时取组合内的金额字段计算,匹配成功后即可同时拿到ID和对应金额。
修复后完整代码如下:

from itertools import combinations
import pandas as pd

# 初始化数据集
data = [[1 , 20.5], [2 , 32.0], [3 , 10.0], [4 , 5.0], [5 , 12.0], [6 , 10.0], [7, 2.0], [8 , 1.0], [9 , 6.0], [10 , 3.0], [11, 2.0]]
df = pd.DataFrame(data, columns=['ID', 'EUR'])
summed_amount = 42.5

# 直接生成(ID, 金额)对的组合,保留ID关联关系
for value in range(1, len(df) + 1):
    # 传入ID和金额的配对元组生成组合
    possible_combination = list(combinations(zip(df['ID'], df['EUR']), value))
    # 校验时取每个元组的第二位(即金额)求和
    match_list = [combo for combo in possible_combination if sum(item[1] for item in combo) == summed_amount]
    if match_list:
        first_match = match_list[0]
        # 格式化为 ID:金额 的输出形式
        format_items = [f"{item[0]}:{item[1]}" for item in first_match]
        print("List->", " ".join(format_items))
        
        # 如果需要分开返回ID列表和金额列表,启用下面两行即可
        # id_list = [item[0] for item in first_match]
        # amount_list = [item[1] for item in first_match]
        break

运行上述代码的输出和预期完全一致:

List-> 1:20.5 3:10.0 5:12.0
注意事项

涉及浮点数金额计算时,直接累加可能出现浮点精度误差(比如若干个一位小数相加得到类似42.49999999999999的结果),如果业务对精度要求高,可以将所有金额乘以100转为整数(单位变为欧分)后再做求和校验,避免精度问题导致的匹配失败。

内容的提问来源于stack exchange,提问作者Jay Aitsch Aitsch

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 09:57:17