如何从字典构建一个defaultdict?

113
如果我有 d=dict(zip(range(1,10),range(50,61))),如何将它构建成collections.defaultdict
看起来defaultdict唯一可用的参数是工厂函数,我需要初始化并遍历原始d来更新defaultdict吗?
3个回答

126

阅读文档

第一个参数提供了default_factory属性的初始值;默认为None。 所有其余参数都被视为传递给字典构造函数的参数,包括关键字参数。

from collections import defaultdict
d=defaultdict(int, zip(range(1,10),range(50,61)))

或者给定一个字典d

from collections import defaultdict
d=dict(zip(range(1,10),range(50,61)))
my_default_dict = defaultdict(int,d)

3
能否将这种方法扩展到嵌套字典中?以下方法并不能按预期工作:default_dict = defaultdict(None,{"a":1,"b":{"c":3}}),例如default_dict["e"]引发KeyError错误而非返回None。 - alancalvitti
8
这是因为传递None并不意味着它会为未知的键生成None,而实际上它根本不会使用默认值。你需要使用 defaultdict(lambda: None, {....}) - Eric Darchis

17
你可以通过将字典作为第二个参数传递来构建一个defaultdict。
from collections import defaultdict

d1 = {'foo': 17}
d2 = defaultdict(int, d1)

print(d2['foo'])  ## should print 17
print(d2['bar'])  ## should print 0 (int() returns 0)

8
你使用的是哪个版本的Python?我在Python 3.8.3中默认的整数值是0,而不是1。 - shmulvad
我想 d2['bar'] 应该打印为 0,因为还没有计算过 bar 的实例? - ric.row

-2

你可以使用可调用的方式通过字典创建一个defaultdict。

from collections import defaultdict

def dict_():
    return {'foo': 1}

defaultdict_with_dict = defaultdict(dict_)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接