[英]python sum dict keys AND sum dict values
首先,这个问题是相关的,但没有解决我的问题Python和基于键的dict值
我有这样的DICT
{
...
"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],
...
}
我想要的结果是这样的蠢事
{
...
"_ACTION1": [summed up values for all _ACTION1 on any http]
"_ITEM1": [summed up values for all _ITEM1 on any http]
...
}
等等 :-)
我尝试过的东西
sum(filter(None, chain(*[value for key, value in DICT if key.endswith(('_ACTION1', '_ACTION2', '_ITEM1'))])))
显然,只需将所有内容汇总到一个数字中
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中:
>>> ================================ RESTART ================================
>>>
{'_ITEM1': 0.1425, '_ITEM2': 2458.8625, '_ACTION2': 213, '_ACTION1': 10.084907}
>>>
请注意,我将您的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)
不知道null
来自何处,但您可以使用str.find提取部分子字符串和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实际上是None,则将其过滤掉:
dd[k[k.find("_"):]] += sum(filter(None, v))
或者只保留数字:
import numbers
dd[k[k.find("_"):]] + sum(i for i in v if isinstance(i, numbers.Number))
这是collections.defaultdict的工作,因为我们需要注意,例如在sums ['_ ACTION1']存在一个初始化的浮点数,然后我们可以+ = sth到它,并以编程方式确保内置dictionary
可能导致开销。
#!/usr/bin/env python3
from collections import defaultdict
DICT = {
"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],
}
sums = defaultdict(lambda: 0.)
# with python2 better use
# for (k, l) in DICT.iteritems():
for (k, l) in DICT.items():
sums[k[k.find("_"):]] += sum(x for x in l if x is not None)
for pair in sums.items():
print(pair)
输出:
('_ITEM1', 0.1425)
('_ITEM2', 2458.8625)
('_ACTION2', 213.0)
('_ACTION1', 10.084907)
一个解法:
null = 0 # null is invalid in Python unless a variable
data = {
"httpXYZ_ACTION1": [10, 0],
"http123_ITEM1": [0.055, 0.0875],
"http456_ACTION1": [0.075, 0.066667],
"httpABC_ITEM2": [14.666667, 12.195833],
"http999_ACTION2": [null, 2],
}
categories = set([c.split('_')[-1] for c in data.keys()])
sums = {k: 0 for k in categories}
for k, v in data.items():
key = k.split('_')[-1]
if key in categories:
sums[key] += 1
print sums
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.