如何使用自定义条件对一个列表列表进行排序?
我有一个银行账户列表,其中注册了两项操作,存款和取款。
列表中的每个列表都具有 [date_of_operation, amount, balance] 格式,其中正数表示“存款操作”,负数表示“取款操作”
例子:
# date || amount || balance
# 01/01/2001 || -200.00 || 300.76
# 20/10/1992 || 500.76 || 500.76
# 13/07/2021 || 1000.00 || 1300.76
# 13/07/2021 || -200.00 || 1100.76
account = [
[datetime.strptime("01/01/2001", "%d/%m/%Y"), -200.0, 300.76],
[datetime.strptime("20/10/1992", "%d/%m/%Y"), 500.76, 500.76],
[datetime.strptime("13/07/2021", "%d/%m/%Y"), 1000.0, 1300.76],
[datetime.strptime("13/07/2021", "%d/%m/%Y"), -200, 1100.76]
]
现在我想用两个条件对列表进行排序:
- 按日期倒序
- 如果两个项目之间的日期相同,则余额必须遵循一致的顺序
所需输入的示例:
date || amount || balance
13/07/2021 || -200.00 || 1100.76
13/07/2021 || 1000.00 || 1300.76
01/01/2001 || -200.00 || 300.76
20/10/1992 || 500.76 || 500.76
但是我无法完成此操作,我尝试按日期和余额以相反的顺序对列表进行排序:
account = sorted(account, key=lambda x:(x[0], x[2]), reverse=True)
但是输出不是想要的,因为前两项是互换的:
date || amount || balance
13/07/2021 || 1000.00 || 1300.76
13/07/2021 || -200.00 || 1100.76
01/01/2001 || -200.00 || 300.76
20/10/1992 || 500.76 || 500.76
如何在排序函数中使用自定义条件获得所需的输出?
回答
最简单的解决方法是取消排序键中的 balance 组件:
ount = sorted(account, key=lambda x:(x[0], -x[2]), reverse=True)
这将有效地消除reverse对余额的影响,同时使日期部分不受影响。