Python 如何在减少DICT列表的同时求和DICT的特定值?

Python 如何在减少DICT列表的同时求和DICT的特定值?,python,dictionary,Python,Dictionary,我有一个目录列表,结构如下: { "acquirer_id": 1, "acquirer_name": "CIELO", "client_id": 15520, "created_at": "2020-09-03T17:39:52.233566", "fee_amount": 0, # Needs to be ad

我有一个目录列表,结构如下:

  {
    "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"
  }
我看到了,但问题是我并不是只有整数。我尝试将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]

为了只对带有数字的一个进行求和,然后再合并,我不能对
收单机构id
客户id
求和,因为它们是id。因此,我必须将dict列表缩减为一个dict,添加每个dict的特定值。这样做最适合的方式是什么?

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

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
]
然后:


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

输出:

{
    "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"],
}

客户id如何?它也应该被排除在外,因为它也是一个id吗?是的,我刚刚提到了收单机构id作为一个例子是的,它需要是数字的一个实例。数字,因为那里也有一些浮点数。尝试
sum(v代表k,v代表d.items(),if(k中不是“id”)和isinstance(v,(int,float)))
?您是希望对每个dict中的所有数字求和,还是希望最终得到另一个字典,其中所有键都包含所有其他字典中这些键的和?
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"],
}