使用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
相关产品推荐
相关产品推荐

