110

我怎样才能转换defaultdict

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

做个普通人dict

{'2': ['a'], '3': ['b'], '1': ['b', 'a']}
4

3 回答 3

148

您可以简单地调用dict

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

但请记住,defaultdict一个字典:

>>> isinstance(a, dict)
True

只是行为略有不同,因为当您尝试访问丢失的密钥时(通常会引发 a KeyError),default_factory将改为调用:

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

这就是您print a在字典的数据端出现之前看到的内容。

因此,在不实际创建新对象的情况下获得更多类似 dict 的行为的另一个技巧是 reset default_factory

>>> a.default_factory = None
>>> a[4].append(10)
Traceback (most recent call last):
  File "<ipython-input-6-0721ca19bee1>", line 1, in <module>
    a[4].append(10)
KeyError: 4

但大多数时候这不值得麻烦。

于 2013-12-06T16:21:14.123 回答
33

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

from collections import defaultdict
recurddict = lambda: defaultdict(recurddict)
data = recurddict()
data["hello"] = "world"
data["good"]["day"] = True

将 defaultdict 转换回 dict 的另一种简单方法是使用json模块

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

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

于 2015-08-31T03:32:10.900 回答
17

defaultdict如果您甚至想要一个用于将递归转换为a的递归版本,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)
于 2015-06-18T17:10:17.280 回答