如何解决比较字典的多个值并汇总结果
我有一个用例,在比较这些值时,我需要忽略sku
,targetFlag
和qualifierFlag
,并且列表中的任何字典是否具有与这三个值相同的值,并且它应该与所有这三个键和值一起汇总在一个字典中。
有人可以告诉我我需要做些什么修改,或者有其他更好的解决方案来获得正确的结果。
到目前为止,与上述选项进行比较时,我尝试过的解决方案只能取一个值:
from collections import OrderedDict
import pandas as pd
d = OrderedDict()
d = (pd.DataFrame(lst)
.groupby(['endDate','storeCode','startDate','promoName','targetFlag','qualifierFlag'])
.sku
.agg(set)
.reset_index()
.to_dict('r'))
lt = [{
"sku":"40428200","storeCode":"316","endDate":"05445100","promoName":"2201:316 SUPER 37100548200","startDate":"40505000","targetFlag":"0","qualifierFlag":"0",},{
"sku":"4567","targetFlag":"1","qualifierFlag":"1",{
"sku":"12345","storeCode":"123","promoName":"2201:316 GRAND 0548200",{
"sku":"40428200","endDate":"18840100","promoName":"2201:316 AVI 37125790200",}
]
预期结果将是这样
[
{'endDate': '05445100','promoName': '2201:316 GRAND 37100548200','startDate': '40505000','storeCode': '123','res': [
{
'qualifierFlag': '0','sku': '12345','targetFlag': '1'
}
]
},{'endDate': '05445100','promoName': '2201:316 SUPER 37100548200','storeCode': '316','sku': '40428200','targetFlag': '0'
},{
'qualifierFlag': '1','sku': '4567','targetFlag': '1'
},]
},{'endDate': '18840100','promoName': '2201:316 AVI 37125790200','targetFlag': '1'
}
]
]
解决方法
以下代码能解决问题吗?
d = (pd.DataFrame(lst)
.groupby(['endDate','storeCode','startDate','promoName'])['sku','targetFlag','qualifierFlag']
.agg(set)
.reset_index()
.to_dict('r'))
,
使用itertools.groupby
:
from itertools import groupby
def key_func(x):
return (x["storeCode"],x["promoName"],x["startDate"],x["endDate"])
lst = sorted(lst,key=key_func)
result = [
{
"storeCode": k[0],"promoName": k[1],"startDate": k[2],"endDate": k[3],"res": [
{
"sku": x["sku"],"qualifierFlag": x["qualifierFlag"],"targetFlag": x["targetFlag"],}
for x in list(v)
],}
for k,v in groupby(lst,key=key_func)
]
结果:
[
{
"storeCode": "123","promoName": "2201:316 GRAND 0548200","startDate": "40505000","endDate": "05445100","res": [{"sku": "12345","qualifierFlag": "0","targetFlag": "1"}],},{
"storeCode": "316","promoName": "2201:316 AVI 37125790200","endDate": "18840100","res": [{"sku": "40428200","promoName": "2201:316 SUPER 37100548200","res": [
{"sku": "40428200","targetFlag": "0"},{"sku": "4567","qualifierFlag": "1","targetFlag": "1"},],]
Jean-Marc Billod的方法使用set
作为聚合函数,因此仅返回唯一值。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。