Python sum dict基于键的值 [英] Python sum dict values based on keys

查看:629
本文介绍了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
}]



python

  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):
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())
/ pre>

还有一个更通用的解决方案:

  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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆