Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/338.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转换为dict?_Python_Defaultdict - Fatal编程技术网

Python 如何将defaultdict转换为dict?

Python 如何将defaultdict转换为dict?,python,defaultdict,Python,Defaultdict,如何转换defaultdict number_to_letter defaultdict(<class 'list'>, {'2': ['a'], '3': ['b'], '1': ['b', 'a']}) 您只需调用dict: >>> a defaultdict(<type 'list'>, {'1': ['b', 'a'], '3': ['b'], '2': ['a']}) >>> dict(a) {'1': ['b', 'a']

如何转换
defaultdict

number_to_letter
defaultdict(<class 'list'>, {'2': ['a'], '3': ['b'], '1': ['b', 'a']})

您只需调用
dict

>>> a
defaultdict(<type 'list'>, {'1': ['b', 'a'], '3': ['b'], '2': ['a']})
>>> dict(a)
{'1': ['b', 'a'], '3': ['b'], '2': ['a']}
与此稍有不同的是,当您尝试访问丢失的密钥时,通常会引发
KeyError
,此时会调用
default\u factory

>>> a.default_factory
<type 'list'>

但大多数情况下,这并不值得麻烦。

如果您甚至想要将递归的
defaultdict
转换为
dict
的递归版本,您可以尝试以下方法:

#! /usr/bin/env python3

from collections import defaultdict

def ddict():
    return defaultdict(ddict)

def ddict2dict(d):
    for k, v in d.items():
        if isinstance(v, dict):
            d[k] = ddict2dict(v)
    return dict(d)

myddict = ddict()

myddict["a"]["b"]["c"] = "value"

print(myddict)

mydict = ddict2dict(myddict)

print(mydict)

如果您的defaultdict是递归定义的,例如:

from collections import defaultdict
recurddict = lambda: defaultdict(recurddict)
data = recurddict()
data["hello"] = "world"
data["good"]["day"] = True
另一种将defaultdict转换回dict的简单方法是使用
json
module

import json
data = json.loads(json.dumps(data))

当然,defaultdict中包含的值需要限制在json支持的数据类型中,但是如果您不打算在dict中存储类或函数,这应该不是问题。

dict(数字到字母)
@TimPeters,因为这实际上是一个写得很好的问题,标题很明显(并且应该很容易在搜索中出现),作为未来的参考,如果我们找不到更好的傻瓜,那么值得把它作为一个答案……这个答案应该会有帮助:@JonClements,很好的观点,但DSM已经做到了-我希望他的答案被接受:-)TimPeters祝贺10公里btw。。。我有一种感觉,这不会花你太长时间——你应该(无耻的插件)在某个时候突然出现:)我刚刚开始学习用Python编程。您能否详细解释一下如何使用
default\u factory
?我只是不知道发生了什么事。抱歉。什么是“keyrerror”?@user2988464:您已经使用了
default\u factory
——这是您在创建
defaultdict
时传递的函数,比如
defaultdict(int)
defaultdict(list)
。每当您试图在字典中查找某个键时,例如,在一个常用字典中,您要么得到该值,要么引发一个
KeyError
异常(例如错误,告诉您找不到该键)。但是在
defaultdict
中,它会调用
default\u factory
函数为您生成一个新的默认值(这是
defaultdict
中的“默认值”)。值得注意的是,Django的.items模板属性不能与defaultdict一起使用,这就是我在这里结束的原因!因此,转换有一个很好的理由非常有帮助地指出,
pickle
(用于将python对象保存到文件中)无法处理中的
defaultdict
。这正是我所需要的!不幸的是,我的defaultdict有一些键在没有自定义编码器的情况下是不可JSON序列化的(这些键是元组——不是我的选择,只是我的问题)。如果字典的理解只有两层(即
defaultdict(lambda:defaultdict(int))
):
{k:dict(v)代表k,v在foo.items()}
好主意,太糟糕了,我的数据不会序列化为JSON:*(它会将你的整数转换为字符串…)。。。。
#! /usr/bin/env python3

from collections import defaultdict

def ddict():
    return defaultdict(ddict)

def ddict2dict(d):
    for k, v in d.items():
        if isinstance(v, dict):
            d[k] = ddict2dict(v)
    return dict(d)

myddict = ddict()

myddict["a"]["b"]["c"] = "value"

print(myddict)

mydict = ddict2dict(myddict)

print(mydict)
from collections import defaultdict
recurddict = lambda: defaultdict(recurddict)
data = recurddict()
data["hello"] = "world"
data["good"]["day"] = True
import json
data = json.loads(json.dumps(data))