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

如何基于双列表循环按用户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匹配的用户:
    1. 累加该用户所有充值金额到add_funds
    2. 累加该用户所有消费金额到spent
    3. 计算最终余额:final_balance = add_funds - spent
    4. 输出格式: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}")

修复说明

  1. 先提取目标用户ID集合,避免处理无关用户
  2. 用字典user_stats持久化存储每个用户的累计数据,避免重复初始化
  3. 遍历所有交易完成累加后,再统一输出结果,确保数据准确

正确输出

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 15:40:56