将dict转换为defaultdict

时间:2018-08-09 14:08:08

标签: python python-3.x dictionary python-collections

以下代码使用{}运算符组合两个默认字典。

from collections import defaultdict
aa=defaultdict(str)
bb=defaultdict(str)
aa['foo']+= '1'
bb['bar']+= '2'
cc = {**aa,**bb}
type(cc)

但是,正如我们看到的那样,{}操作符返回的是dict类型,而不是defaultdict类型。

是否可以将dict转换回defaultdict?

3 个答案:

答案 0 :(得分:4)

您可以在对defaultdict的呼叫中直接使用拆包功能。 defaultdictdict的子类,会将这些参数传递给其父级以创建字典,就像将它们传递给dict一样。

cc = defaultdict(str, **aa, **bb)
# defaultdict(<class 'str'>, {'bar': '2', 'foo': '1'})

答案 1 :(得分:1)

您可以做的很长。这种方法的好处是您无需重新指定defaultdict的类型:

def merge_two_dicts(x, y):
    z = x.copy()
    z.update(y)
    return z

cc = merge_two_dicts(aa, bb)

在单个表达式中解压缩是可行的,但效率低下:

n = 500000

d1 = defaultdict(int)
d1.update({i: i for i in range(n)})
d2 = defaultdict(int)
d2.update({i+n:i+n for i in range(n)})

%timeit defaultdict(int, {**d1, **d2})  # 150 ms per loop
%timeit merge_two_dicts(d1, d2)         # 90.9 ms per loop

答案 2 :(得分:0)

defaultdict构造函数可以接受两个参数,其中第一个是用于默认值的函数,第二个是映射(字典)。它从传入的字典中复制键/值。

 >>> d = defaultdict(list, {'a': [1,2,3]})
 >>> d['a']
 [1, 2, 3]