Python二维数组按值分组转换为字典的正确实现方法
二维列表按键分组转字典实现
需求说明
给定输入二维列表:mat=[[3, 37],[1, 41],[2, 37],[5, 41],[4, 35]]
需要将每个子列表的第二个元素作为字典键,同键对应的所有子列表第一个元素组成列表作为字典值,目标输出为:{37:[3,2],41:[1,5],35:[4]}
原有代码问题分析
你写的代码逻辑存在两处错误,导致结果不符合预期:
- 遍历过程中每次遇到同一个键,都会执行
dic[i[1]]=list(),覆盖该键之前已经存储的内容 - 后续直接执行
dic[i[1]]=i[0],将键对应的值从列表替换为单个整数,最终每个键只会保留最后一次遍历到的对应值,因此输出{37: 2, 41: 5, 35: 4}
正确实现方案
方案1:原生基础写法(无依赖,全版本兼容)
遍历子列表时先判断键是否存在,不存在则初始化对应值为列表,存在则直接追加元素:
mat = [[3, 37], [1, 41], [2, 37], [5, 41], [4, 35]] result = {} for value, key in mat: if key not in result: result[key] = [value] else: result[key].append(value)
运行后result的值就是目标输出{37: [3, 2], 41: [1, 5], 35: [4]}
方案2:使用collections.defaultdict简化逻辑
导入标准库的defaultdict,可以省略手动判断键是否存在的步骤,访问不存在的键时会自动生成空列表作为默认值:
from collections import defaultdict mat = [[3, 37], [1, 41], [2, 37], [5, 41], [4, 35]] result = defaultdict(list) for value, key in mat: result[key].append(value) # 如需转为普通字典,可执行 result = dict(result)
方案3:使用dict.setdefault实现(无导包写法)
利用字典自带的setdefault方法,不需要额外导包也能省去显式的键存在判断:
mat = [[3, 37], [1, 41], [2, 37], [5, 41], [4, 35]] result = {} for value, key in mat: result.setdefault(key, []).append(value)
内容的提问来源于stack exchange,提问作者Vinay Naik
相关产品推荐
相关产品推荐

