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