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

将字典二元组键转换为嵌套字典的Python函数问题排查

排查代码问题&正确实现方案

让我先帮你拆解原代码里的问题,再给出符合需求的实现:

原代码的核心错误

  • 参数名不匹配:函数定义的参数是values,但你在函数内部用了d.keys()和d.items()——d这个变量根本没定义!能运行起来大概率是你测试时外部有同名变量,但这是非常不规范的错误,会导致函数复用性极差。
  • 逻辑完全偏离需求:你把所有键存到列表l后,用dict(l)把元组列表转成字典,这会把每个元组的第一个元素当作键、第二个当作值,但后面的元组会覆盖前面的(比如(0,0)和(0,1)转成字典后,0的值会被最后一个元组的1覆盖),得到{0:1,1:1}。之后你又把这个错误的字典赋值给dictionary[v],自然输出和预期完全不符。

正确的实现思路

我们的目标是把原字典中(外层键, 内层键): 值的结构,转换成外层键: {内层键: 值}的嵌套字典:

  1. 遍历原字典的每一组键值对
  2. 对于每个二元组键(outer_k, inner_k),先检查外层字典是否存在outer_k:不存在就新建空字典
  3. 把inner_k: 值添加到对应的内层字典中

修正后的代码

from typing import Dict, Tuple

def convert(values: Dict[Tuple[int, int], int]) -> Dict[int, Dict[int, int]]:
    nested_dict = {}
    for (outer_key, inner_key), value in values.items():
        # 外层键不存在时,初始化空字典
        if outer_key not in nested_dict:
            nested_dict[outer_key] = {}
        # 向内层字典添加键值对
        nested_dict[outer_key][inner_key] = value
    return nested_dict

# 测试验证
values = {(0, 0): 0, (0, 1): 1, (1, 0): 1, (1, 1): 0}
print(convert(values))  # 输出: {0: {0: 0, 1: 1}, 1: {0: 1, 1: 0}}

更简洁的写法(用collections.defaultdict)

如果不想手动检查外层键是否存在,可以用defaultdict简化代码,它会自动为不存在的键初始化空字典:

from collections import defaultdict
from typing import Dict, Tuple

def convert(values: Dict[Tuple[int, int], int]) -> Dict[int, Dict[int, int]]:
    nested_dict = defaultdict(dict)
    for (outer_key, inner_key), value in values.items():
        nested_dict[outer_key][inner_key] = value
    # 转成普通字典返回(也可以直接返回defaultdict,看你的需求)
    return dict(nested_dict)

内容的提问来源于stack exchange,提问作者Jonathan C

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:55:15