Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何将嵌套字典转换为defaultdict?_Python_Python 3.x - Fatal编程技术网

Python 如何将嵌套字典转换为defaultdict?

Python 如何将嵌套字典转换为defaultdict?,python,python-3.x,Python,Python 3.x,如何将嵌套字典转换为嵌套defaultdict dic = {"a": {"aa": "xxx"}} default = defaultdict(lambda: None, dic) print(default["dummy_key"]) # return None print(default["a"]["dummy_key"]) # KeyError 您需要在嵌套字典的所有级别上循环或递归 除非它的深度(如在数百个级别中)可能会达到荒谬的程度,或者范围太广以至于性能因素很小,否则递归在这

如何将嵌套字典转换为嵌套defaultdict

dic = {"a": {"aa": "xxx"}}
default = defaultdict(lambda: None, dic)
print(default["dummy_key"])  # return None
print(default["a"]["dummy_key"])  # KeyError

您需要在嵌套字典的所有级别上循环或递归

除非它的深度(如在数百个级别中)可能会达到荒谬的程度,或者范围太广以至于性能因素很小,否则递归在这里可能是最简单的:

def defaultify(d):
    if not isinstance(d, dict):
        return d
    return defaultdict(lambda: None, {k: defaultify(v) for k, v in d.items()})

或者,如果您想让它处理所有映射,而不仅仅是dict,您可以在
isinstance
检查中使用
collections.abc.Mapping
而不是
dict


当然,这是假设您有一个纯嵌套的dict。如果您有(比如)从典型的JSON响应中解析的内容,其中可能有带有列表值和dict元素的dict,那么您还必须处理其他可能性:

def defaultify(d):
    if isinstance(d, dict):
        return defaultdict(lambda: None, {k: defaultify(v) for k, v in d.items()})
    elif isinstance(d, list):
        return [defaultify(e) for e in d]
    else:
        return d
但是,如果这实际上来自JSON,那么最好在解析JSON时使用
defaultdict
,而不是将其解析为dict,然后再将其转换为defaultdict

文档中有一个使用
OrderedDict
代替
dict
的例子,但这对我们来说不太管用,不像
OrderedDict
dict
defaultdict
不能仅仅将对的iterable作为其唯一参数;它首先需要默认值factory。因此,我们可以使用以下方法将其绑定到中:



等等。

谢谢,它运行得很好。是的,我也有清单,你的建议对我很有帮助。非常感谢。@ MiKooKaWaWa如果你真的从<代码> JSON获得。加载< /代码>或类似,你可能首先要考虑建立一个<代码> Debug Trp< <代码>,而不是首先建立一个<代码> DICT<代码>,然后转换它。例如,解释如何使解码器对每个JSON对象使用
OrderedDict
而不是
dict
,您可以做同样的事情使其使用
defaultdict
。哦,非常感谢。我试过了,但发生了一个错误。json.loads({“a”:{“aa”:“xxx”}',object_pairs_hook=collections.defaultdict)#TypeError:第一个参数必须是可调用的,或者没有,也许我错了。@MaikoOhkawa你不能只使用
defaultdict
,因为它需要一个额外的第一个参数,但你可以使用,例如
functools.partial(defaultdict,lambda:None)
,或
lambda*args,**kw:defaultdict(lambda:None,*args,**kw)
。我会把它编辑成答案。这很好用,非常感谢!顺便说一下,我为您的上一个示例提交了一个编辑,将
object\u hook\u pairs
更改为
object\u pairs\u hook
,发现了一个错误并发现了错误销售。
d = json.loads(jsonstring, object_hook_pairs=partial(defaultdict, lambda: None))