问题描述
这是从数据库返回的对象的列表:
>>> credit_transactions
[<Transaction: some detail>, <Transaction: more detail>, <Transaction: hello>, <Transaction: yay dummy data>]
以下是我用来生成字典的代码。
这就是我要执行的操作,如果tr.category
可用,那么tr.amount
应该添加到最后一个值。
我现在得到的只是tr.category
的最后一个值。
credit = { tr.category:tr.amount for tr in credit_transactions}
对于credit_transactions
的以下值,上述代码仅针对最后一个值生成了字典键值对。
如果要重复键,我想要这些值的总和。
>>> for tr in credit_transactions:
... tr.category
...
<Category: Bonus>
<Category: Lottery>
<Category: Lottery>
<Category: Bonus>
<Category: Salary>
<Category: Bonus>
>>>
1楼
您可以明确总结:
sums = {}
for tr in credit_transactions:
try:
sums[tr.category] += tr.amount # not first in this category
except KeyError:
sums[tr.category] = tr.amount # first in this category
或使用 ,它会自动将丢失的键初始化为零:
from collections import defaultdict
sums = defaultdict(float)
for tr in credit_transactions:
sums[tr.category] += tr.amount
正如您已经注意到的,如果您使用简单的dict-comprehension,则后面的项目会覆盖前面的项目,而不是求和。
2楼
您不能对一个键使用多个值的字典理解。
它将不断覆盖。
您必须使用defaultdict
(或dict.setdefault
)
defaultdict
默认设置所有值列表。
( ):
from collections import defaultdict
credit = defaultdict(list)
for tr in credit_transactions:
credit[tr.category].append(tr.amount)
dict.setdefault
设置为空列表(如果为空)。
( )
credit = {}
for tr in credit_transactions:
credit.setdefault(tr.category, []).append(tr.amount)