【问题标题】:How can I sum specific values of dicts while reducing a list of dicts?如何在减少字典列表的同时对字典的特定值求和?
【发布时间】:2020-09-17 15:43:32
【问题描述】:

我有一个具有以下结构的字典列表:

  {
    "acquirer_id": 1,
    "acquirer_name": "CIELO",
    "client_id": 15520,
    "created_at": "2020-09-03T17:39:52.233566",
    "fee_amount": 0, # Needs to be added
    "net_amount": 0, # Needs to be added
    "quantity": 0, # Needs to be added
    "sales_amount": 0, # Needs to be added
    "sales_average": 0, # Needs to be added
    "sales_date": "2020-08-13"
  }

我见过Sum list of dictionaries with same key,但问题是我没有只有整数。我试图将 dicts 过滤字符串和数字分开,例如:

separated_dicts = [({key: value for (key, value) in _dict.items() if isinstance(value, str)}, {
                     key: value for (key, value) in _dict.items() if isinstance(value, numbers.Number)}) for _dict in sales]

为了仅将一个与数字相加并稍后合并,但是,我无法将 acquirer_idclient_id 相加 因为它们是 ids。所以,我必须将字典列表减少为单个字典,添加每个字典的特定值。这样做最pythonic的方式是什么?

【问题讨论】:

  • client_id 怎么样?因为它也是一个 id,所以不应该排除它吗?
  • 是的,我刚刚提到了acquireer_id作为例子
  • 是的,它必须是 numbers.Number 的实例,因为那里也有一些浮点数。
  • 试试sum(v for k, v in d.items() if (not "id" in k) and isinstance(v, (int, float)))?
  • 您想对每个字典中的所有数字求和,还是希望得到另一个字典,其中所有键都包含所有其他字典中这些键的总和?

标签: python dictionary


【解决方案1】:

例如,我在一个列表中使用了两个相等的条目。类型为 intfloat 的非 ID 字段被求和,其余字段被汇总到一个列表中,如果您只需要这些字段的最后一个值,请将 [-1] 附加到 [e.get(k, None) for e in l] 的末尾以获取最后一个元素。

Try it online!

x = {
    "acquirer_id": 1,
    "acquirer_name": "CIELO",
    "client_id": 15520,
    "created_at": "2020-09-03T17:39:52.233566",
    "fee_amount": 1,
    "net_amount": 2,
    "quantity": 3,
    "sales_amount": 4,
    "sales_average": 5,
    "sales_date": "2020-08-13"
}

l = [x, x]

print({
    k : (
        sum(e.get(k, 0) for e in l)
        if issubclass(t, (int, float)) and '_id' not in k else
        [e.get(k, None) for e in l]
    ) for k, t in {
        k : type(v) for e in l for k, v in e.items()
    }.items()
})

输出:

{
    "acquirer_id": [1, 1],
    "acquirer_name": ["CIELO", "CIELO"],
    "client_id": [15520, 15520],
    "created_at": ["2020-09-03T17:39:52.233566", "2020-09-03T17:39:52.233566"],
    "fee_amount": 2,
    "net_amount": 4,
    "quantity": 6,
    "sales_amount": 8,
    "sales_average": 10,
    "sales_date": ["2020-08-13", "2020-08-13"],
}

【讨论】:

    【解决方案2】:

    首先,创建一个新的字典列表,其中仅包含需要求和的键:

    from numbers import Number
    summable_sales = [
        {k: v for k, v in d.items() if isinstance(v, Number) and not k.endswith("_id")}
        for d in sales
    ]
    

    然后sum all the dicts:

    from collections import Counter
    sums = Counter()
    for d in summable_sales:
        sums.update(d)
    print(d)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-06-16
      • 2021-03-03
      • 2014-05-16
      • 1970-01-01
      • 1970-01-01
      • 2018-08-30
      • 2022-11-17
      • 2017-07-16
      相关资源
      最近更新 更多