如何修改Python代码实现多Deal ID的统计计算需求
解决多Deal ID自动适配的统计问题
我来帮你优化代码,让它能自动适配任意数量的Deal ID,同时解决原代码里的潜在bug:
首先,先分析下原代码的问题:
- 临时变量(比如
sum_1_M、list_1)的命名容易混淆,而且每次循环都要手动重置,既麻烦又容易出错 - 没有处理某个Deal ID没有M行(会触发除以0的错误)或者没有W行(空列表访问索引报错)的边界情况
- 嵌套循环的写法不够简洁,维护起来比较费劲
下面是优化后的代码,用字典来分组统计每个Deal ID的数据,完全支持自动适配新增的ID:
filename = '/home/salman/Desktop/input.txt' rows = [['507', 'W', '1000', '1'], ['1', 'M', '6', '2'], ['1', 'W', '1400', '3'], ['1', 'M', '8', '8'], ['1', 'T', '101', '10'], ['507', 'M', '4', '12'], ['1', 'W', '1700', '15'], ['1', 'M', '7', '16'], ['507', 'M', '8', '20']] # 初始化两个字典,分别存储M类型和W类型的统计数据 # m_stats: key=Deal ID, value={'sum': M行第3元素总和, 'count': M行数量} m_stats = {} # w_stats: key=Deal ID, value=[所有W行第3元素的数值列表] w_stats = {} # 遍历所有行,分组统计 for row in rows: deal_id = row[0] flag = row[1] num = int(row[2]) if flag == 'M': # 如果当前ID不在m_stats里,先初始化结构 if deal_id not in m_stats: m_stats[deal_id] = {'sum': 0, 'count': 0} m_stats[deal_id]['sum'] += num m_stats[deal_id]['count'] += 1 elif flag == 'W': # 如果当前ID不在w_stats里,先初始化空列表 if deal_id not in w_stats: w_stats[deal_id] = [] w_stats[deal_id].append(num) # 获取所有唯一的Deal ID,包括那些只有T行的ID all_deal_ids = set(row[0] for row in rows) # 遍历输出每个ID的统计结果(sorted可选,让ID按顺序输出) for deal_id in sorted(all_deal_ids): # 处理M类型的平均值:如果有M行就计算,否则显示N/A m_avg = m_stats[deal_id]['sum'] / m_stats[deal_id]['count'] if deal_id in m_stats else None # 处理W类型的最小/最大值:如果有W行就计算,否则显示N/A w_min = min(w_stats[deal_id]) if deal_id in w_stats else None w_max = max(w_stats[deal_id]) if deal_id in w_stats else None # 格式化输出,根据实际需求调整空值显示方式 print(f"{deal_id} {w_min or 'N/A'} {w_max or 'N/A'} {int(m_avg) if m_avg is not None else 'N/A'}")
优化后的优势:
- 自动适配所有ID:不管新增多少个Deal ID(比如2、5、6等),都会自动收集并统计
- 健壮性更强:处理了没有M行或W行的边界情况,不会报错
- 逻辑清晰易维护:用字典分组存储每个ID的数据,避免了临时变量反复重置的混乱
- 可扩展性好:如果以后需要新增其他类型的统计,直接在循环里加判断即可
运行这段代码,你会得到和原代码一致的结果,而且新增任意ID后都能正常统计。
内容的提问来源于stack exchange,提问作者Logitech Flames
相关产品推荐
相关产品推荐

