Python嵌套列表按首元素分组提取值构建无重复映射方法
嵌套列表同组标识与关联值提取方案
原代码问题说明
- 依赖相邻索引比较判断同组的逻辑存在天然缺陷:为避免越界将循环范围设为
len(JJ)-1必然漏掉最后一个元素,同时比较相邻元素相等的逻辑无法正确完成分组聚合 - 分组完成前直接对key列表转set去重,会打乱原有顺序,彻底破坏key和值的映射关系
正确实现代码
核心思路是直接遍历所有子列表,动态维护当前分组的标识和对应值列表,遇到新标识就将旧分组存入结果,全程保持key和值的绑定关系,从根源上避免索引越界和映射丢失问题。
输出一一对应双列表(完全匹配期望格式)
JJ = [['HC', 0, ' 3.6'], ['HC', 1, ' 3.9'], ['HC', 2, ' 7.0'], ['NC', 7, ' 0.3'], ['NC', 8, ' 0.4'], ['NC', 9, ' 0.5'], ['NC', 10, ' 0.6'], ['NC', 11, ' 0.7'], ['DC', 12, ' 0.8'], [['DC','NC'], 13, ' 0.9']] list1 = [] list2 = [] current_key = None current_vals = [] for sub_item in JJ: key = sub_item[0] # 去除第三个元素的前后空格并转为浮点数,匹配期望输出格式 val = float(sub_item[2].strip()) if current_key is None: # 初始化第一个分组 current_key = key current_vals.append(val) elif key == current_key: # 同组元素直接追加值 current_vals.append(val) else: # 遇到新分组,先把旧分组存入结果 list1.append([current_key] if not isinstance(current_key, list) else current_key) list2.append(current_vals) # 重置为新分组 current_key = key current_vals = [val] # 循环结束后存入最后一个分组,解决漏处理末尾元素的问题 if current_key is not None: list1.append([current_key] if not isinstance(current_key, list) else current_key) list2.append(current_vals)
执行后得到的结果和期望完全一致:
print(list1) # [['HC'], ['NC'], ['DC'], ['DC', 'NC']] print(list2) # [[3.6, 3.9, 7.0], [0.3, 0.4, 0.5, 0.6, 0.7], [0.8], [0.9]]
输出字典映射版本
如果需要直接得到key到值列表的映射,注意列表类型的key不可哈希,转为元组即可:
result_map = {} current_key = None current_vals = [] for sub_item in JJ: key = sub_item[0] val = float(sub_item[2].strip()) # 列表类型key转元组,满足字典键的可哈希要求 map_key = tuple(key) if isinstance(key, list) else (key,) if current_key is None: current_key = map_key current_vals.append(val) elif map_key == current_key: current_vals.append(val) else: result_map[current_key] = current_vals current_key = map_key current_vals = [val] if current_key is not None: result_map[current_key] = current_vals
内容的提问来源于stack exchange,提问作者Priyankush Ghosh
相关产品推荐
相关产品推荐

