Python sum dict基于键的值 [英] Python sum dict values based on keys
本文介绍了Python sum dict基于键的值的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
如何对来自dict的值进行求和,其中值是字符串。我的意思是如何计算字典中乘数相同的值。
dict
values = [
{
rashod:0,
prihod:230.0,
prod_name:r,
prod_hola :t
},
{
rashod:0,
prihod:230.0,
prod_name:r,
prod_hola:t
},
{
rashod:0.0,
prihod:0,
prod_name:c ,
prod_hola:f
},
{
rashod:0,
prihod:100.0,
prod_name :c,
prod_hola:f
},
{
rashod:0.0,
prihod:0,
prod_name:a,
prod_hola:b
},
{
rashod:0,
prihod 1500.0,
prod_name:a,
prod_hola:b
}]
dictf = reduce(lambda x,y:dict((k,v + y [k] ,v in x.iteritems()),values)
print dictf
但是这个总和dict和输出中的所有值都如下所示:
{'rashod':1930.0,'prihod':-17020.0,'prod_name ':'abcfrtabcfrtabcfrt'}
我想要的是输出如下:
[{'rashod':1930.0,'prihod':-17020.0,'prod_name':'a','prod_hola':'b},
{'rashod':1930.0,'prihod':-17020.0,'prod_name':'c','prod_hola':'f},
{'rashod':1930.0,'prihod':-17020.0, 'prod_name':'r','prod_hola':'t},]
解决方案
具体解决方案,没有尝试巧妙:
def reproup(values):
/ pre>
groups = dict()
中的d值:
key =(d [prod_name],d [prod_hola])
如果组中的键:
group = groups [key]
group [rashod] + = d [rashod]
group [prihod] + = d [prihod]
else:
groups [key] = d.copy()
返回列表(groups.values())
还有一个更通用的解决方案:
def generic_regroup (值,键):
groups = dict()
valkeys = [k表示值[0]中的k,如果k不在键中]
在值为
键=组合中的k的元组(d [k])
如果组中的键:
group = groups [key]
for val中的k:
group [k] + = d [k]
else:
groups [key] = d.copy()
返回列表(groups.values())
results = generic_regroup ,(prod_name,prod_hola))
现在有人肯定会有更多的巧妙的解决方案涉及itertools ...
How to sum values from dict where values are string. I mean how to sum values where multiply key is same in dictionary.
dict
values = [ { "rashod": 0, "prihod": 230.0, "prod_name": "r", "prod_hola": "t" }, { "rashod": 0, "prihod": 230.0, "prod_name": "r", "prod_hola": "t" }, { "rashod": 0.0, "prihod": 0, "prod_name": "c", "prod_hola": "f" }, { "rashod": 0, "prihod": 100.0, "prod_name": "c", "prod_hola": "f" }, { "rashod": 0.0, "prihod": 0, "prod_name": "a", "prod_hola": "b" }, { "rashod": 0, "prihod": 1500.0, "prod_name": "a", "prod_hola": "b" }]
python
dictf = reduce(lambda x, y: dict((k, v + y[k]) for k, v in x.iteritems()), values) print dictf
But this sum all values in dict, and output is like:
{'rashod': 1930.0, 'prihod': -17020.0, 'prod_name': 'abcfrtabcfrtabcfrt'}
What I want is output like this:
[{'rashod': 1930.0, 'prihod': -17020.0, 'prod_name': 'a','prod_hola':'b}, {'rashod': 1930.0, 'prihod': -17020.0, 'prod_name': 'c','prod_hola':'f}, {'rashod': 1930.0, 'prihod': -17020.0, 'prod_name': 'r','prod_hola':'t},]
解决方案Specific solution, with no attempt at cleverness:
def regroup(values): groups = dict() for d in values: key = (d["prod_name"], d["prod_hola"]) if key in groups: group = groups[key] group["rashod"] += d["rashod"] group["prihod"] += d["prihod"] else: groups[key] = d.copy() return list(groups.values())
And a slightly more generic solution:
def generic_regroup(values, keys): groups = dict() valkeys = [k for k in values[0] if k not in key] for d in values: key = tuple(d[k] for k in keys) if key in groups: group = groups[key] for k in valkeys: group[k] += d[k] else: groups[key] = d.copy() return list(groups.values()) results = generic_regroup(values, ("prod_name", "prod_hola"))
Now someone will certainly chime in with a much more clever solution involving itertools...
这篇关于Python sum dict基于键的值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文