将字典二元组键转换为嵌套字典的Python函数问题排查
排查代码问题&正确实现方案
让我先帮你拆解原代码里的问题,再给出符合需求的实现:
原代码的核心错误
- 参数名不匹配:函数定义的参数是
values,但你在函数内部用了d.keys()和d.items()——d这个变量根本没定义!能运行起来大概率是你测试时外部有同名变量,但这是非常不规范的错误,会导致函数复用性极差。 - 逻辑完全偏离需求:你把所有键存到列表
l后,用dict(l)把元组列表转成字典,这会把每个元组的第一个元素当作键、第二个当作值,但后面的元组会覆盖前面的(比如(0,0)和(0,1)转成字典后,0的值会被最后一个元组的1覆盖),得到{0:1,1:1}。之后你又把这个错误的字典赋值给dictionary[v],自然输出和预期完全不符。
正确的实现思路
我们的目标是把原字典中(外层键, 内层键): 值的结构,转换成外层键: {内层键: 值}的嵌套字典:
- 遍历原字典的每一组键值对
- 对于每个二元组键
(outer_k, inner_k),先检查外层字典是否存在outer_k:不存在就新建空字典 - 把
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
相关产品推荐
相关产品推荐

