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

Perl嵌套哈希转Python实现咨询:多层defaultdict使用问题

实现Python多层嵌套哈希的完美方案

嘿,作为从Perl转Python的过来人,太懂你这种对自动嵌套哈希的需求了!Perl里那种随手就能写$row{dept}{owner}{name}{access} = "\\server\path";的爽感,刚转Python的时候确实会觉得普通defaultdict不够用。

其实你只需要把defaultdict改成递归嵌套的版本,就能完美复刻Perl的嵌套哈希行为。具体做法很简单:

from collections import defaultdict

def nested_dict():
    # 递归定义:每个不存在的键都会生成一个新的nested_dict
    return defaultdict(nested_dict)

row = nested_dict()

现在你就可以像在Perl里那样直接写多层赋值或访问了:

# 赋值
row["IT"]["John Smith"]["Reporting"]["access"] = r"\\server\path"

# 直接查询
print(row["IT"]["John Smith"]["Reporting"]["access"])  # 输出: \\server\path

原理说明

这个递归的nested_dict函数会在你访问任何不存在的键时,自动生成一个新的defaultdict(nested_dict),相当于给每一层都开启了“自动创建子哈希”的功能,完全匹配Perl里自动生成嵌套哈希的逻辑。

备选方案(不推荐)

如果你不想用递归defaultdict,也可以用普通dict配合setdefault来手动创建每一层,但写起来会非常繁琐:

row = {}
row.setdefault("IT", {}).setdefault("John Smith", {}).setdefault("Reporting", {})["access"] = r"\\server\path"

显然这个方法远不如递归defaultdict简洁,尤其是层级多的时候。

额外小技巧:转成普通dict

如果后续需要把这个嵌套的defaultdict转换成普通dict(比如要序列化到JSON),可以写个简单的递归函数:

def to_regular_dict(d):
    if isinstance(d, defaultdict):
        return {k: to_regular_dict(v) for k, v in d.items()}
    return d

regular_row = to_regular_dict(row)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 06:59:11