7

考虑一个带有一个属性和一个属性的dicts列表:dateamount

transactions = [
    {'date': '2013-05-12', 'amount': 1723},
    {'date': '2013-07-23', 'amount': 4523},
    {'date': '2013-02-01', 'amount': 2984},
]

我想添加一个 balance 属性,但为此我必须按date顺序遍历列表:

balance = 0
for t in transactsions:    # Order by date
    balance += t['amount']
    t['balance'] = balance

怎么办?如果我用具有和属性的对象替换dicts,那Transaction有可能吗?dateamount

4

3 回答 3

3

是的,函数 sorted() 的“key”关键字参数都可以。看一下片段:

>>> l = [1, 3, 2]
>>> sorted(l)
[1, 2, 3]
>>> sorted(l, key=lambda x: x**2)
[1, 2, 3]
>>> sorted(l, key=lambda x: -x)
[3, 2, 1]

您可以将可调用对象作为“键”关键字参数传递给 sorted(),可调用对象将用于提供排序键。对于您的第一个问题,您可以将事务包装在 sorted 中并将 lambda x: x['date] 作为“键”传递。对于对象,只需将“键”更改为 lambda x: x.date 之类的东西。

于 2013-11-11T07:40:29.673 回答
0

找到了!从这个答案

for t in sorted(transactions, key=lambda k: k['date']):
    balance += t['amount']
    t['balance'] = balance

有趣的是,搜索并没有得到那个答案,但发布后它出现在侧边栏的顶部!

于 2013-11-11T07:36:56.243 回答
0

小心,您的循环中有错字(交易)

transactions.sort(key=lambda x:x['date'])
for t in transactions:
    balance += t['amount']
    t['balance'] = balance

这应该可以解决问题,这样您的列表就会保持排序

于 2013-11-11T07:39:01.277 回答