[英]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_id
和client_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)
例如,我在列表中使用了两个相等的条目。 对int
或float
类型的非 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.