比较字典的多个值并汇总结果

如何解决比较字典的多个值并汇总结果

我有一个用例,在比较这些值时,我需要忽略skutargetFlagqualifierFlag,并且列表中的任何字典是否具有与这三个值相同的值,并且它应该与所有这三个键和值一起汇总在一个字典中。

有人可以告诉我我需要做些什么修改,或者有其他更好的解决方案来获得正确的结果。

到目前为止,与上述选项进行比较时,我尝试过的解决方案只能取一个值:

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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?