【问题标题】:How to sum values in dicts if some key in that dicts has same month?如果字典中的某个键具有相同的月份,如何对字典中的值求和?
【发布时间】:2016-05-06 17:33:11
【问题描述】:

我有 Django 查询集:

summary = Contracts.objects.all() \
                   .filter(datestart__gte=time_threshold) \
                   .values('datestart', 'id_deposits__id_valuta__name') \
                   .annotate(sum=Sum('suma')) \
                   .order_by('-id_deposits__id_valuta__name')

我通过以下方式捕获 qs:

for s in summary:
    for k, v in CURRENCY.items():
        if s['id_deposits__id_valuta__name'] == k:
            s['sum'] *= CURRENCY[k]

它会根据需要更新货币总和。它返回字典

{'sum': Decimal('400000.00'), 'datestart': datetime.date(2016, 3, 1), 'id_deposits__id_valuta__name': 'Гривня'}
{'sum': Decimal('2500000.00'), 'datestart': datetime.date(2016, 4, 25), 'id_deposits__id_valuta__name': 'Долар'}
{'sum': Decimal('2500000.00'), 'datestart': datetime.date(2016, 4, 25), 'id_deposits__id_valuta__name': 'Долар'}

现在我需要对字典中“sum”键的值求和,当“datestart”值中的月份相等时。

例如。一些 dicts 有 sum, datestart 键。当 dicts 同月时,我需要有“总和”值的总和:2016-04-03、2016-04-14

那么如何以简约的方式做到这一点?

【问题讨论】:

  • 为什么不直接使用for s in summary: s['sum'] *= CURRENCY.get(s['id_deposits__id_valuta__name'], 1)?你这里有一本字典,使用字典查找。
  • @MartijnPieters,我对单线算法不太聪明,抱歉)谢谢你的想法
  • 那么2016-04-032015-04-05应该怎么处理呢?是同一个月(都是 4 月),还是应该以不同的方式划分(2016 年 4 月与 2015 年 4 月)?
  • @MartijnPieters 应该以不同的方式存储,

标签: python django dictionary sum


【解决方案1】:

您可以将每个字典转换为Counter,其中月份是键,值是s['sum'],然后将它们相加:

from collections import Counter

sum((Counter({x['datestart'].month: x['sum']}) for x in summary), Counter()) 
# Counter({4: Decimal('5000000.00'), 3: Decimal('400000.00')})

请注意,如果您需要区分月份和年份,请改用{(x['datestart'].month, x['datestart'].year): x['sum']}

【讨论】:

    【解决方案2】:

    使用字典来跟踪每月的总和;你可以在这里使用defaultdict 来管理初始值:

    from collections import defaultdict
    from decimal import Decimal
    
    per_month = defaultdict(Decimal)
    
    for s in summary:
        s['sum'] *= CURRENCY.get(s['id_deposits__id_valuta__name'], 1)
        month = s['datestart'].year, s['datestart'].month
        per_month[month] += s['sum']
    

    我已经删除了您对CURRENCY.items() 的循环;您可以只使用dict.get() 来获取值;如果键不在字典中,则使用1

    请注意,我将您的总和分组到 (year, month) 元组,假设您希望将不同年份的月份视为单独的总和。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-02-26
      • 1970-01-01
      • 1970-01-01
      • 2021-10-07
      • 1970-01-01
      • 2021-11-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多