You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 06:18:21