Python 3.6递归为字典添加嵌套路径键值对的实现方法
解决方案:迭代式实现(推荐)
要实现把嵌套路径对应的值添加到空字典中,核心是要区分路径的中间层级和最后一个层级——中间层级需要创建嵌套字典,最后一个层级直接赋值。这里给你一个简洁的迭代实现,完全适配Python 3.6+:
data = {} def add_value(data, path, value): parts = path.split('.') current_dict = data # 遍历路径的前n-1个部分,创建嵌套字典 for part in parts[:-1]: if part not in current_dict: current_dict[part] = {} current_dict = current_dict[part] # 给最后一个路径节点赋值 current_dict[parts[-1]] = value # 调用测试 add_value(data, "root.sub.item", 12) print(data) # 输出: {'root': {'sub': {'item': 12}}}
代码解释
- 拆分路径:用
split('.')把路径拆分成层级列表,比如"root.sub.item"变成['root', 'sub', 'item']。 - 遍历中间层级:用
parts[:-1]取到除最后一个节点外的所有部分,逐个检查是否存在于当前字典中,不存在就创建空字典,然后把current_dict指向这个新创建的子字典,逐步深入嵌套层级。 - 赋值最后节点:最后直接把值赋给最内层字典的最后一个路径节点。
原代码的问题
你提供的原代码没有区分中间节点和最后节点,会把所有路径部分都创建成空字典,最终item会是一个空字典而非目标值12,这就是不符合预期的原因。
递归式实现(可选)
如果你更喜欢递归思路,也可以这样写:
data = {} def add_value_recursive(data, path, value): parts = path.split('.') # 递归终止条件:路径只剩最后一个节点,直接赋值 if len(parts) == 1: data[parts[0]] = value return first_part = parts[0] # 如果当前节点不存在,创建空字典 if first_part not in data: data[first_part] = {} # 递归处理剩余路径 add_value_recursive(data[first_part], '.'.join(parts[1:]), value) # 调用测试 add_value_recursive(data, "root.sub.item", 12) print(data) # 输出同样符合预期
递归的逻辑是:每次把路径拆分成第一个节点和剩余路径,逐步深入嵌套层级,直到路径只剩最后一个节点时完成赋值。
内容的提问来源于stack exchange,提问作者Dennis Delin
相关产品推荐
相关产品推荐

