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
相关产品推荐
相关产品推荐

