python sum dict键和sum dict值

2024-09-27 23:20:18 发布

您现在位置:Python中文网/ 问答频道 /正文

首先,这个问题是相关的,但不是解决我的问题 Python sum dict values based on keys

我有这样的口述

{
...
"httpXYZ_ACTION1": [10, 0],
"http123_ITEM1": [0.055, 0.0875],
"http456_ACTION1": [0.01824, 0.066667],
"httpABC_ITEM2": [1214.666667, 1244.195833],
"http999_ACTION2": [null, 213],
...
}

我所期望的结果就是这样的结论

^{pr2}$

以此类推:-)

我试过了

sum(filter(None, chain(*[value for key, value in DICT if key.endswith(('_ACTION1', '_ACTION2', '_ITEM1'))])))

很明显,把所有的东西都归纳成一个数字


Tags: keyvalueonkeysdictbasedvaluessum
3条回答

不知道null来自何处,但您可以使用str.查找要提取部分子字符串和defaultdict来处理重复键:

from collections import defaultdict
dd = defaultdict(float)

for k, v in d.items():
     dd[k[k.find("_"):]] += sum(v)

print(dd)

defaultdict(<class 'float'>, {'_ITEM1': 0.1425, '_ACTION1': 10.084907, '_ACTION2': 213.0, '_ITEM2': 2458.8625})

如果null实际上为“无”,则将其过滤掉:

^{pr2}$

或者只保留数字:

 import numbers

 dd[k[k.find("_"):]] + sum(i for i in v if isinstance(i, numbers.Number))
inDict={
"httpXYZ_ACTION1": [10, 0],
"http123_ITEM1": [0.055, 0.0875],
"http456_ACTION1": [0.01824, 0.066667],
"httpABC_ITEM2": [1214.666667, 1244.195833],
"http999_ACTION2": [None, 213],
}
outDictKeys=set('_'+x.split('_')[1] for x in inDict)
outDict={}
for outKey in outDictKeys:
    total=0
    for inKey in inDict:
        if inKey.endswith(outKey):
            total=total+sum([x for x in inDict[inKey] if x is not None])
    outDict[outKey]=total
print (outDict)

在python 3中运行:

^{pr2}$

请注意,我将您的null值视为None,它被视为零,即被忽略。怎么总结就看你了。在

from collections import defaultdict

input = {
  "httpXYZ_ACTION1": [10, 0],
  "http123_ITEM1": [0.055, 0.0875],
  "http456_ACTION1": [0.01824, 0.066667],
  "httpABC_ITEM2": [1214.666667, 1244.195833],
  "http999_ACTION2": [None, 213],
}

output = defaultdict(float)
for k,v in input.items():
  key = '_' + k.partition('_')[2]
  output[key] += sum((float(val) for val in v if isinstance(val, (int,float))))

print(output)

相关问题 更多 >

    热门问题