将 dict 转换为 defaultdict
Cast dict to defaultdict
以下代码使用 {} 运算符组合两个 defaultdict。
from collections import defaultdict
aa=defaultdict(str)
bb=defaultdict(str)
aa['foo']+= '1'
bb['bar']+= '2'
cc = {**aa,**bb}
type(cc)
但是,正如我们所见,如果我们 运行 这个,{}
运算符 returns 是 dict
类型而不是 defaultdict
类型。
有没有办法将 dict
转换回 defaultdict?
defaultdict
构造函数可以有两个参数,第一个是用于默认的函数,第二个是映射 (dict)。它从传入的字典中复制 keys/values。
>>> d = defaultdict(list, {'a': [1,2,3]})
>>> d['a']
[1, 2, 3]
您可以在对 defaultdict
的调用中直接使用解包。 defaultdict
是 dict
的子类,并将这些参数传递给其父类以创建字典,就好像它们已传递给 dict
.
cc = defaultdict(str, **aa, **bb)
# defaultdict(<class 'str'>, {'bar': '2', 'foo': '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
以下代码使用 {} 运算符组合两个 defaultdict。
from collections import defaultdict
aa=defaultdict(str)
bb=defaultdict(str)
aa['foo']+= '1'
bb['bar']+= '2'
cc = {**aa,**bb}
type(cc)
但是,正如我们所见,如果我们 运行 这个,{}
运算符 returns 是 dict
类型而不是 defaultdict
类型。
有没有办法将 dict
转换回 defaultdict?
defaultdict
构造函数可以有两个参数,第一个是用于默认的函数,第二个是映射 (dict)。它从传入的字典中复制 keys/values。
>>> d = defaultdict(list, {'a': [1,2,3]})
>>> d['a']
[1, 2, 3]
您可以在对 defaultdict
的调用中直接使用解包。 defaultdict
是 dict
的子类,并将这些参数传递给其父类以创建字典,就好像它们已传递给 dict
.
cc = defaultdict(str, **aa, **bb)
# defaultdict(<class 'str'>, {'bar': '2', 'foo': '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