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

如何在Python字典的指定路径中添加数据?含函数实现示例

如何在Python字典的指定路径中添加数据?

这个需求我碰到过好多次——要在嵌套字典的指定层级路径里添加键值对,还得支持同一个路径下追加新数据对吧?我来给你实现这个add_value函数,顺便拆解下逻辑。

核心思路

我们需要一步步沿着路径深入字典:

  1. 遍历路径的前n-1个节点,每一层如果不存在就创建空字典,确保能顺利走到目标层级
  2. 到达路径的最后一个节点时,把传入的value(元组/列表)拆成键值对,添加到对应层级的字典里(支持追加,不是覆盖)

函数实现

def add_value(dic, path, value):
    current = dic
    # 遍历路径,走到倒数第二个节点
    for key in path[:-1]:
        # 如果当前节点不存在,就创建空字典
        if key not in current:
            current[key] = {}
        # 移动到下一层级的字典
        current = current[key]
    
    # 处理最后一个路径节点
    last_key = path[-1]
    # 确保最后一个节点是字典(避免之前被设置成非字典类型)
    if last_key not in current or not isinstance(current[last_key], dict):
        current[last_key] = {}
    # 将传入的value转为键值对添加进去
    current[last_key][value[0]] = value[1]
    
    return dic

代码解释

  • current变量用来跟踪我们当前在字典的哪一层,初始就是传入的原始字典
  • 遍历路径的前n-1个键:每一步都检查键是否存在,不存在就创建空字典,这样能保证我们可以顺利走到目标层级
  • 处理最后一个键的时候,先确保它对应的是字典(防止之前被误设成字符串、数字等非字典类型),然后把value的第一个元素作为键,第二个作为值添加进去——这样同一个路径多次调用时,会在最后一层字典里追加新的键值对,而不是覆盖整个字典

测试调用示例

我们按照你给的例子测试一下:

d = {}
d = add_value(d, ['A', 'B'], ('log.txt', '12KB'))
print(d)
# 输出: {'A': {'B': {'log.txt': '12KB'}}}

d = add_value(d, ['X', 'Y', 'Z'], ('backup.bin', '17MB'))
print(d)
# 输出: {'A': {'B': {'log.txt': '12KB'}}, 'X': {'Y': {'Z': {'backup.bin': '17MB'}}}}

d = add_value(d, ['X', 'Y', 'Z'], ('file.lst', '5KB'))
print(d)
# 输出: {'A': {'B': {'log.txt': '12KB'}}, 'X': {'Y': {'Z': {'backup.bin': '17MB', 'file.lst': '5KB'}}}}

额外注意事项

  • 如果传入的value不是长度为2的可迭代对象(比如列表或元组),函数会报错。如果需要兼容这种情况,可以加个前置判断:
    if len(value) != 2:
        raise ValueError("value必须是长度为2的列表或元组")
    
  • 如果路径中的某个节点已经存在但不是字典(比如之前被设置成字符串),当前函数会把它强制转成字典。如果需要严格校验,可以在遍历的时候加判断:
    if key in current and not isinstance(current[key], dict):
        raise TypeError(f"路径中的节点 {key} 不是字典类型,无法继续操作")
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 08:09:27