Python3如何遍历字典内列表元素依次抵扣支付金额并更新数据?
实现思路
- 先获取用户输入的总支付金额,做合法性校验,确保输入为非负数值
- 初始化剩余支付金额为用户输入的总金额
- 按顺序遍历
payment_details列表中的每条待付款记录:- 若剩余支付金额为0,直接终止遍历
- 若剩余支付金额 ≥ 当前记录待付金额:将当前记录
to_pay设为0、paid设为True,剩余支付金额减去当前记录原待付金额 - 若剩余支付金额 < 当前记录待付金额:将当前记录
to_pay减去剩余支付金额,剩余支付金额置为0,终止遍历
- 遍历结束后返回剩余未使用金额和处理后的付款数据
完整实现代码
# 原始付款数据 payment_data = { 'payment_details': [ {'name': 'X', 'to_pay': 9000, 'paid': False, 'date': '2021-09-28'}, {'name': 'X', 'to_pay': 8000, 'paid': False, 'date': '2021-09-27'}, {'name': 'X', 'to_pay': 6000, 'paid': False, 'date': '2021-09-26'}, {'name': 'X', 'to_pay': 5000, 'paid': False, 'date': '2021-09-25'}, {'name': 'X', 'to_pay': 3000, 'paid': False, 'date': '2021-09-24'}, {'name': 'X', 'to_pay': 2000, 'paid': False, 'date': '2021-09-23'} ] } def process_payment(payment_data, total_pay): remaining = total_pay # 按顺序遍历待付款列表 for record in payment_data['payment_details']: if remaining <= 0: break current_to_pay = record['to_pay'] if remaining >= current_to_pay: # 全额抵扣当前记录 record['to_pay'] = 0 record['paid'] = True remaining -= current_to_pay else: # 部分抵扣当前记录 record['to_pay'] -= remaining remaining = 0 # 返回剩余未使用的金额(如果有)和处理后的数据 return remaining, payment_data if __name__ == '__main__': # 接收用户输入并做合法性校验 while True: input_str = input("请输入支付总金额:") try: total_pay = float(input_str) if total_pay < 0: print("支付金额不能为负数,请重新输入") continue break except ValueError: print("输入格式有误,请输入数字") remaining, processed_data = process_payment(payment_data, total_pay) # 输出处理结果 print(f"\n抵扣完成,剩余未使用金额:{remaining:.2f}") print("处理后的付款记录:") for record in processed_data['payment_details']: print(record)
测试示例
输入支付总金额为15000时,输出结果如下:
抵扣完成,剩余未使用金额:0.00
处理后的付款记录:
{'name': 'X', 'to_pay': 0, 'paid': True, 'date': '2021-09-28'}
{'name': 'X', 'to_pay': 2000, 'paid': False, 'date': '2021-09-27'}
{'name': 'X', 'to_pay': 6000, 'paid': False, 'date': '2021-09-26'}
{'name': 'X', 'to_pay': 5000, 'paid': False, 'date': '2021-09-25'}
{'name': 'X', 'to_pay': 3000, 'paid': False, 'date': '2021-09-24'}
{'name': 'X', 'to_pay': 2000, 'paid': False, 'date': '2021-09-23'}
内容的提问来源于stack exchange,提问作者mr-noob
相关产品推荐
相关产品推荐

