Python 字典,查找重复的键值的总和

Python Dictionary, finding the sum of key values that repeat

提问人:poppinpython 提问时间:7/14/2022 更新时间:7/14/2022 访问量:64

问:

我有一个字典列表,如下所示:

[{
    "id": "42f409d0-2cef-49b0-a027-59ed571cc2a9",
    "cost": 0.868422,
    "environment": "nonprod"
},
{
    "id": "42f409d0-2cef-49b0-a027-59ed571cc2a9",
    "cost": 0.017017,
    "environment": "prod"
},
{
    "id": "aa385029-afa6-4f1a-a1d9-d88b7d934699",
    "cost": 0.010304,
    "environment": "prod"
},
{
    "id": "b13a0676-6926-49db-808c-3c968a9278eb",
    "cost": 2.870336,
    "environment": "nonprod"
},
{
    "id": "b13a0676-6926-49db-808c-3c968a9278eb",
    "cost": 0.00455,
    "environment": "prod"
},
{
    "id": "b13a0676-6926-49db-808c-3c968a9278eb",
    "cost": 0.032458,
    "environment": "prod"
}]

我很难理解的部分是,我如何按 id 和环境对这些内容进行分组,并将给定环境的成本相加。

最终结果应该是,给定 ID 只有一对 prod 和非 prod,并且将 prod 或 nonprod 的所有成本加起来,分别位于 prod 中的单个 id 或 nonprod 中的单个 id 下。

我希望这已经足够详细了,谢谢!

python-3.x 数据操作

评论

0赞 Rohith 7/14/2022
如果可以指定预期的输出结构,那将会很有帮助

答:

1赞 Michael S. 7/14/2022 #1

尝试将 dict 值放入 pandas 数据帧中,然后使用 pandas 的 groupby 函数(我将变量设置为等于上面的字典列表):dicts

import pandas as pd
df = pd.DataFrame(dicts)
df.groupby(["id", "environment"], as_index=False).sum()

输出:


                                      id    environment  cost
0   42f409d0-2cef-49b0-a027-59ed571cc2a9    nonprod      0.868422
1   42f409d0-2cef-49b0-a027-59ed571cc2a9    prod         0.017017
2   aa385029-afa6-4f1a-a1d9-d88b7d934699    prod         0.010304
3   b13a0676-6926-49db-808c-3c968a9278eb    nonprod      2.870336
4   b13a0676-6926-49db-808c-3c968a9278eb    prod         0.037008
4赞 d.b 7/14/2022 #2
d = {}
for el in data:
    d[(el["id"], el["environment"])] = d.get((el["id"], el["environment"]), 0) + el["cost"]
d
# {('42f409d0-2cef-49b0-a027-59ed571cc2a9', 'nonprod'): 0.868422,
#  ('42f409d0-2cef-49b0-a027-59ed571cc2a9', 'prod'): 0.017017,
#  ('aa385029-afa6-4f1a-a1d9-d88b7d934699', 'prod'): 0.010304,
#  ('b13a0676-6926-49db-808c-3c968a9278eb', 'nonprod'): 2.870336,
#  ('b13a0676-6926-49db-808c-3c968a9278eb', 'prod'): 0.037008}
2赞 Zircoz 7/14/2022 #3

除了上述答案之外,通过为每笔交易创建唯一密钥的 python 解决方案也将起作用。这段代码正是这样做的,甚至可以使用 .id|typedefaultdict

dictCounter = dict()
#assuming test is the list of dicts
for eachEntry in test:
    newUniqueKey = eachEntry["id"]+"|"+eachEntry["environment"]
    if newUniqueKey not in dictCounter.keys():
        dictCounter[newUniqueKey]=eachEntry["cost"]
    else:
        dictCounter[newUniqueKey]+=eachEntry["cost"]