首页 > 解决方案 > 转到python字典中列表中的下一个索引并执行计算

问题描述

我有一个带有列表的字典,列表中还有多个字典值,请看下面:

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'}
            ]
    }

我想要做的是,我会从用户那里获取支付金额的输入,如果用户给出 9000 ,那么字典的payment_detailswhere键的第一个索引将为 0 并且将是但支付金额大于 9000 ,假设 19000 ,在这种情况下,字典键的第一个索引将为 0 并且也会是,但它将减去前一个(19000-9000=10000)的值并转到下一个索引 1 ,当索引 1 值为 8000 时,它将是0(因为我们有 10000)和支付将是并转到上一个上的下一个索引。对不起,我的英语不好。我怎样才能在 Python3 中做到这一点?to_paypaidTruepayment_detailsto_paypaidTrueTrue

标签: pythonpython-3.x

解决方案


假设它payment_data["payment_details"]是按to_pay降序排序的,那么以下应该可以工作,至少是第一次(因为这样列表可能不再按 排序to_pay)。

payment_amount = 13000
for details in payment_data["payment_details"]:
    if details["to_pay"] == payment_amount:
        details["to_pay"] = 0
        details["paid"] = True
        break
else:
    for details in payment_data["payment_details"]:
        to_pay = details["to_pay"]
        if payment_amount >= to_pay:
            details["to_pay"] = 0
            payment_amount -= to_pay
        else:
            details["to_pay"] -= payment_amount
            break

您可能可以将其分解为一些功能以避免重复。您可能还会考虑其他场景中的行为,例如在您的示例中,用户输入 4000 会发生什么?


推荐阅读