如何基于双列表循环按用户ID统计充值、消费及余额?
用户收支统计代码修复
原始数据
用户交易列表
list1 = [ {'user_id': 1, 'server_id': '10', 'amount': 100}, {'user_id': 2, 'server_id': None, 'amount': 10000}, {'user_id': 3, 'server_id': '10', 'amount': 200}, {'user_id': 1, 'server_id': '10', 'amount': 200}, {'user_id': 2, 'server_id': '10', 'amount': 110}, {'user_id': 2, 'server_id': None, 'amount': 40000}, {'user_id': 3, 'server_id': '10', 'amount': 100}, {'user_id': 3, 'server_id': None, 'amount': 12500}, {'user_id': 3, 'server_id': '10', 'amount': 100}, {'user_id': 1, 'server_id': None, 'amount': 22500}, ]
目标用户ID列表
list2 = [ {'id': 1}, {'id': 4}, {'id': 18}, {'id': 3}, {'id': 2}, ]
统计规则
list1中server_id为None代表用户充值,不为None代表用户消费- 仅统计
list1中user_id与list2中id匹配的用户:
- 累加该用户所有充值金额到
add_funds- 累加该用户所有消费金额到
spent- 计算最终余额:
final_balance = add_funds - spent- 输出格式:
UserX spent 金额, add_funds 金额, final_balance 金额
错误代码及问题
错误代码
tmp = [] for l2 in list2: for l1 in list1: spent = 0 add_fund = 0 if l1['user_id'] == l2['id'] and l1['user_id'] not in tmp: tmp.append(l1['user_id']) if l1['server_id'] == None: add_fund += l1['amount'] elif l1['server_id'] != None: spent += l1['amount'] final_balance = add_fund - spent if final_balance > 0: print(f"User{l1['user_id']} spent {format(spent, ',d').replace(',',',')}, add_funds {format(add_fund, ',d').replace(',',',')}, final_balance {format(final_balance, ',d').replace(',',',')}")
核心问题
- 内层循环每次都会重置
spent和add_fund为0,无法累加用户的所有交易金额 - 匹配到单条交易就输出,而非统计完该用户所有交易后统一输出
- 逻辑混乱,导致出现不存在的用户(如User4)的错误输出
修复后的代码
# 提取需要统计的用户ID集合,过滤无效用户 target_user_ids = {user['id'] for user in list2} # 用字典存储每个用户的累计充值、消费金额 user_stats = {} for transaction in list1: user_id = transaction['user_id'] # 跳过非目标用户 if user_id not in target_user_ids: continue # 初始化用户统计数据(首次处理时) if user_id not in user_stats: user_stats[user_id] = {'add_funds': 0, 'spent': 0} # 根据交易类型累加金额 if transaction['server_id'] is None: user_stats[user_id]['add_funds'] += transaction['amount'] else: user_stats[user_id]['spent'] += transaction['amount'] # 统一输出统计结果 for user_id, stats in user_stats.items(): final_balance = stats['add_funds'] - stats['spent'] # 格式化金额为带千分位的字符串 spent_str = format(stats['spent'], ',d') add_funds_str = format(stats['add_funds'], ',d') balance_str = format(final_balance, ',d') print(f"User{user_id} spent {spent_str}, add_funds {add_funds_str}, final_balance {balance_str}")
修复说明
- 先提取目标用户ID集合,避免处理无关用户
- 用字典
user_stats持久化存储每个用户的累计数据,避免重复初始化 - 遍历所有交易完成累加后,再统一输出结果,确保数据准确
正确输出
User1 spent 300, add_funds 22,500, final_balance 22,200 User2 spent 110, add_funds 50,000, final_balance 49,890 User3 spent 400, add_funds 12,500, final_balance 12,100
内容的提问来源于stack exchange,提问作者Rogers
相关产品推荐
相关产品推荐

