python,list嵌套多个元素不相同的dict进行分组合并

找了半天也没汇总的好办法只能自己写一个

实现如下

list1=[

{'id':'A'apple':99,'orange‘:20},

{'id':'A',apple':100,'Banana‘:50},

{'id':'B,'Banana‘:50},

{'id':'B,'Banana‘:10,'orange‘:30,'Cherry':2},

]

输出

[{'id':'A','apple':199,'orange‘:20','Banana':50,'Cherry':0},

{'id':'B','apple':0,'orange‘:30','Banana':60,'Cherry':2}]

m=MyListDictGroup(list1)

m_g=m.groupby(groupbyKey='id',('id',),completion=True,defaultValues=0)

#-*- coding:utf-8 -*-

class MyListDictGroup(object):
    '''把列表中嵌套的多个Dict进行分组计算'''
    def __init__(self,_data:list,):
        self._data=_data
        self.__dataInit()

    def __dataInit(self):
        self._data_len=len(self._data)
        if self._data_len<=0:
            raise print('数组长度获取失败')

        self._data_all_keys=dict()
        for _k in self._data:
            self._data_all_keys.update(_k)

    def __getNullAllKeysDict(self,defaultValues=0)->dict:
        _r=dict()
        for _k in self._data_all_keys.keys():
            _r.update({_k:defaultValues})
        return _r


    def groupby(self,groupbyKey:str,nokeys:tuple=(None),completion:bool=True,defaultValues=0)->list:
        '''进行分组
        groupbyKey用来分组的字段,必须有
        nokeys:tuple 不进行计算的字段
        completion 是否补齐字段
        defaultValues 补齐默认数值
        '''
        if not bool(nokeys):
            nokeys=(groupbyKey,)
        self.groupbyKey = groupbyKey
        _tempKeys = []
        for _i in self._data:
            if not self.groupbyKey in _i.keys():
                raise print('{0}\n行不存在要分组的key'.format(str(_i)))
            _tempKeys.append(_i.get(self.groupbyKey))

        try:
            self.groupbyKeySet = set(_tempKeys)
        except BaseException as e:
            print('要分组的结果列表转换失败', e)

        _temp_all_list=[]
        for _byKey in self.groupbyKeySet:
            if completion:
                _temp_key_dict= {groupbyKey:_byKey}
            else:
                _temp_key_dict=self.__getNullAllKeysDict(defaultValues)
            _temp_key_dict[groupbyKey]=_byKey
            for _d in self._data:
                if _byKey==_d[groupbyKey]:
                    #_temp_key_dict=self.__dictadd(_temp_key_dict,_d,(groupbyKey,))
                    _temp_key_dict = self.__dictadd(_temp_key_dict, _d, nokeys)
            _temp_all_list.append(_temp_key_dict)
        return _temp_all_list

    def __dictadd(self,o_Dict: dict, addDict: dict,NoKeys:tuple) -> dict:
        r_dict = o_Dict.copy()
        for key in addDict.keys():
            if key in NoKeys:
                continue
            if not o_Dict.get(key):
                r_dict.update({key: addDict.get(key)})
            else:
                try:
                    __ov = o_Dict.get(key)
                    __nv = addDict.get(key)
                    r_dict.update({key: __ov + __nv})
                except:
                    r_dict.update({key: addDict.get(key)})
        return r_dict

    def merge(self,o_list: list, a_list: list, indexKey: str)->list:
        '''根据key合并两个list嵌套的字典'''
        if not o_list or not a_list or not indexKey:
            raise print('要合并的为空')
        _r_list = []
        for _o in o_list:
            _temp_dict = _o.copy()
            for _k in a_list:
                if str(_o.get(indexKey)) == str(_k.get(indexKey)):
                    _temp_a_dict = _k.copy()
                    _temp_a_dict.pop(indexKey)
                    _temp_dict.update(_temp_a_dict)
            _r_list.append(_temp_dict)
        return _r_list

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你可以使用以下代码将多个CSV文件的内容合并成一个CSV文件: ```python import os import glob os.chdir(r'C:\Users\Administrator\Desktop\XJTU-SY_Bearing_Datasets\XJTU-SY_Bearing_Datasets\35Hz12kN\Bearing1_1') csv_list = glob.glob('*.csv') with open('result.csv', 'w') as f: for csv_file in csv_list: with open(csv_file, 'r') as file: f.write(file.read()) print('合并完毕!') ``` 这段代码首先使用`glob.glob`函数获取指定文件夹下的所有CSV文件路径,并将它们存储在`csv_list`列表中。然后,使用`open`函数打开目标CSV文件`result.csv`,并使用嵌套的`with open`语句打开每个CSV文件,将其内容读取并写入目标文件中。最后,打印出合并完毕的提示信息。 请注意,你需要将代码中的文件夹路径`C:\Users\Administrator\Desktop\XJTU-SY_Bearing_Datasets\XJTU-SY_Bearing_Datasets\35Hz12kN\Bearing1_1`替换为你实际的文件夹路径。 #### 引用[.reference_title] - *1* [python将多个csv文件合并成一个](https://blog.csdn.net/weixin_43333379/article/details/117535445)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [python 多个CSV文件 合并成一个csv](https://blog.csdn.net/weixin_30699443/article/details/97124471)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [解决乱码问题,爬虫获取的多个CSV文件批量合并成一个xls或xlsx文件](https://blog.csdn.net/Aspirin008/article/details/130388286)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值