Python 按参数分组和求和字典列表
我有我的产品(饮料、食品等)的字典列表,其中一些产品可能会添加多次。我需要根据product_id参数对我的产品进行分组,并将每组的product_成本和product_数量相加,以获得产品的总价格 我是python的新手,了解如何对字典列表进行分组,但不知道如何对一些参数值求和Python 按参数分组和求和字典列表,python,json,list,dictionary,grouping,Python,Json,List,Dictionary,Grouping,我有我的产品(饮料、食品等)的字典列表,其中一些产品可能会添加多次。我需要根据product_id参数对我的产品进行分组,并将每组的product_成本和product_数量相加,以获得产品的总价格 我是python的新手,了解如何对字典列表进行分组,但不知道如何对一些参数值求和 "products_list": [ { "product_cost": 25, "product_id": 1, "product_name": "Coca-c
"products_list": [
{
"product_cost": 25,
"product_id": 1,
"product_name": "Coca-cola",
"product_quantity": 14,
},
{
"product_cost": 176.74,
"product_id": 2,
"product_name": "Apples",
"product_quantity": 800,
},
{
"product_cost": 13,
"product_id": 1,
"product_name": "Coca-cola",
"product_quantity": 7,
}
]
我需要实现这样的目标:
"products_list": [
{
"product_cost": 38,
"product_id": 1,
"product_name": "Coca-cola",
"product_quantity": 21,
},
{
"product_cost": 176.74,
"product_id": 2,
"product_name": "Apples",
"product_quantity": 800,
}
]
你可以试试熊猫:
d = {"products_list": [
{
"product_cost": 25,
"product_id": 1,
"product_name": "Coca-cola",
"product_quantity": 14,
},
{
"product_cost": 176.74,
"product_id": 2,
"product_name": "Apples",
"product_quantity": 800,
},
{
"product_cost": 13,
"product_id": 1,
"product_name": "Coca-cola",
"product_quantity": 7,
}
]}
将口述传给熊猫并进行分组表演。
然后使用to_dict函数将其转换回dict
result={}
result["products_list"]=df.groupby("product_name",as_index=False).sum().to_dict(orient="records")
结果:
{'products_list': [{'product_cost': 176.74,
'product_id': 2,
'product_name': 'Apples',
'product_quantity': 800},
{'product_cost': 38.0,
'product_id': 2,
'product_name': 'Coca-cola',
'product_quantity': 21}]}
您可以首先对
产品名称
上的词典列表进行排序,然后根据产品名称
对项目进行分组
然后,为每组计算总产品和总数量,创建最终词典并更新列表,然后制作最终词典
from itertools import groupby
dct = {"products_list": [
{
"product_cost": 25,
"product_id": 1,
"product_name": "Coca-cola",
"product_quantity": 14,
},
{
"product_cost": 176.74,
"product_id": 2,
"product_name": "Apples",
"product_quantity": 800,
},
{
"product_cost": 13,
"product_id": 1,
"product_name": "Coca-cola",
"product_quantity": 7,
}
]}
result = {}
li = []
#Sort product list on product_name
sorted_prod_list = sorted(dct['products_list'], key=lambda x:x['product_name'])
#Group on product_name
for model, group in groupby(sorted_prod_list,key=lambda x:x['product_name']):
grp = list(group)
#Compute total cost and qty, make the dictionary and add to list
total_cost = sum(item['product_cost'] for item in grp)
total_qty = sum(item['product_quantity'] for item in grp)
product_name = grp[0]['product_name']
product_id = grp[0]['product_id']
li.append({'product_name': product_name, 'product_id': product_id, 'product_cost': total_cost, 'product_quantity': total_qty})
#Make final dictionary
result['products_list'] = li
print(result)
输出将是
{
'products_list': [{
'product_name': 'Apples',
'product_id': 2,
'product_cost': 176.74,
'product_quantity': 800
},
{
'product_name': 'Coca-cola',
'product_id': 1,
'product_cost': 38,
'product_quantity': 21
}
]
}
就我个人而言,我会通过唯一标识符将其重新组织到另一本词典中。此外,如果您仍然需要列表格式,您仍然可以在字典中重新组织它,但您可以将dict.values()转换为列表。下面是一个函数
def get_totals(product_dict):
totals = {}
for product in product_list["product_list"]:
if product["product_name"] not in totals:
totals[product["product_name"]] = product
else:
totals[product["product_name"]]["product_cost"] += product["product_cost"]
totals[product["product_name"]]["product_quantity"] += product["product_quantity"]
return list(totals.values())
输出为:
[
{
'product_cost': 38,
'product_id': 1,
'product_name': 'Coca-cola',
'product_quantity': 21
},
{
'product_cost': 176.74,
'product_id': 2,
'product_name': 'Apples',
'product_quantity': 800
}
]
现在,如果您需要它属于产品列表密钥。只需将列表重新分配给同一个键即可。而不是返回list(total.values())
do
product_dict["product_list"] = list(total.values())
return product_dict
输出是一个字典,类似于:
{
"products_list": [
{
"product_cost": 38,
"product_id": 1,
"product_name": "Coca-cola",
"product_quantity": 21,
},
{
"product_cost": 176.74,
"product_id": 2,
"product_name": "Apples",
"product_quantity": 800,
}
]
}
你能提供你已经尝试过的吗?只有通过在Loop中附加到defaultdict进行分组你能提供你已经尝试过的吗,也请检查下面我的答案,我使用了与你相同的方法@NatalyFirstova
{
"products_list": [
{
"product_cost": 38,
"product_id": 1,
"product_name": "Coca-cola",
"product_quantity": 21,
},
{
"product_cost": 176.74,
"product_id": 2,
"product_name": "Apples",
"product_quantity": 800,
}
]
}