繁体   English   中英

如何在减少字典列表的同时对字典的特定值求和?

[英]How can I sum specific values of dicts while reducing a list of dicts?

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

  {
    "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 dictionary 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 因此,我必须将 dict 列表减少到单个 dict,添加每个 dict 的特定值。 这样做的最pythonic方式是什么?

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

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
]

然后总结所有的字典

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

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

在线试试吧!

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM