按属性顺序迭代dicts列表

时间:2013-11-11 07:33:22

标签: python sorting

考虑具有dict属性和date属性的amount列表:

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替换为具有Transactiondate属性的amount个对象,那么它是否可能?

3 个答案:

答案 0 :(得分:1)

是的,两个都可以使用函数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]

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

答案 1 :(得分:0)

发现它!来自this answer

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

有趣的是搜索没有导致这个答案,但发布后它出现在侧边栏的顶部!

答案 2 :(得分:0)

小心,你的循环中有一个拼写错误(transactsion)

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

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