Python字典列表按elementid分组合并:去重并重组参数
解决方案
实现思路
- 提取每个字典的主ID段:对
elementid按.分割,取前两段拼接(比如BsWfsElement.1.1→BsWfsElement.1),以此作为分组键。 - 用临时字典存储分组数据:键是主ID,值为该组的基准字典(即
elementid以.1结尾的字典)。 - 遍历所有字典:
- 若当前字典是基准项(子ID为
1):初始化基准字典,保留obstime、lon、lat等固定字段,同时将当前的paramname和paramvalue转为键值对加入。 - 若当前字典是附加项(子ID为
2/3/4等):找到对应主ID的基准字典,直接将paramname和paramvalue转为键值对添加进去。
- 若当前字典是基准项(子ID为
- 最后提取临时字典中的所有值,就是最终的结果列表。
代码实现
def process_elements(element_list): groups = {} for elem in element_list: # 分割elementid,提取主ID和子ID id_parts = elem['elementid'].split('.') main_id = '.'.join(id_parts[:2]) sub_id = id_parts[-1] if sub_id == '1': # 初始化基准字典:保留固定字段,加入当前参数 base_dict = { 'obstime': elem['obstime'], 'lon': elem['lon'], 'lat': elem['lat'] } base_dict[elem['paramname']] = elem['paramvalue'] groups[main_id] = base_dict else: # 附加项:将参数添加到对应基准字典 if main_id in groups: groups[main_id][elem['paramname']] = elem['paramvalue'] # 提取所有分组后的基准字典,转为列表 return list(groups.values())
测试示例
输入:
input_list = [ {'elementid': 'BsWfsElement.1.1', 'obstime': '2022-07-11T20:00:05', 'lon': '59.86400', 'lat': '32.05570', 'paramname': 'multiplicity', 'paramvalue': '4'}, {'elementid': 'BsWfsElement.1.2', 'obstime': '2022-07-11T20:00:05', 'lon': '59.86400', 'lat': '32.05570', 'paramname': 'intensity', 'paramvalue': '10'}, {'elementid': 'BsWfsElement.2.1', 'obstime': '2022-07-11T21:00:00', 'lon': '60.12300', 'lat': '31.89000', 'paramname': 'multiplicity', 'paramvalue': '2'} ]
输出:
[ {'obstime': '2022-07-11T20:00:05', 'lon': '59.86400', 'lat': '32.05570', 'multiplicity': '4', 'intensity': '10'}, {'obstime': '2022-07-11T21:00:00', 'lon': '60.12300', 'lat': '31.89000', 'multiplicity': '2'} ]
注意事项
- 假设同主ID下的
obstime、lon、lat字段值一致,无需处理冲突;如果存在不一致的情况,可以根据需求添加冲突处理逻辑(比如保留基准项的值,或者抛出警告)。 - 如果附加项对应的主ID不存在(即没有
.1结尾的基准项),代码会跳过该附加项;如果需要处理这种情况,可以添加日志或默认逻辑。
内容的提问来源于stack exchange,提问作者eulinean
相关产品推荐
相关产品推荐

