当前位置: 代码迷 >> python >> 生成python字典仅存储来自iterable的最后一个值
  详细解决方案

生成python字典仅存储来自iterable的最后一个值

热度:94   发布时间:2023-07-14 08:45:22.0

这是从数据库返回的对象的列表:

>>> 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>
>>> 

您可以明确总结:

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,则后面的项目会覆盖前面的项目,而不是求和。

您不能对一个键使用多个值的字典理解。 它将不断覆盖。 您必须使用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)