代码之家  ›  专栏  ›  技术社区  ›  Ray Salemi

将dict转换为defaultdict

  •  1
  • Ray Salemi  · 技术社区  · 6 年前

    下面的代码使用{}运算符组合两个defaultdict。

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

    但是,正如我们看到的,如果我们运行这个 {} 运算符返回 dict 不是a型 defaultdict 键入。

    有没有办法 迪克特 又回到了默认状态?

    3 回复  |  直到 5 年前
        1
  •  4
  •   Laurent H. chthonicdaemon    6 年前

    您可以在调用 defaultdict . 默认听写 dict ,并将这些参数传递给其父级以创建字典,就像它们已传递给 迪克特 .

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

    你可以走很长的路。这种方法的好处是不需要重新指定 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
    
        3
  •  0
  •   Edward Minnix    6 年前

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

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