Python基于键的求和值


问题内容

如何从值是字符串的字典中求和。我的意思是在字典中乘法键相同的情况下如何求和。

字典

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]) for 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 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())

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

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"))

现在肯定有人会采用涉及itertools的更聪明的解决方案…