代码之家  ›  专栏  ›  技术社区  ›  the_darkside

更新缺少键值对的嵌套字典

  •  1
  • the_darkside  · 技术社区  · 5 年前

    我有一个具有唯一id的dict和与基数位置对应的键值对嵌套dict:

    {'925328413719459770': {'N': 14,
      'NNW': 116,
      'NW': 38,
      'S': 1,
      'SE': 2,
      'SSE': 1,
      'W': 16,
      'WNW': 146,
      'WSW': 16}}
    

    然而,并非所有嵌套的字典都包含16个可能的基数位置中的每一个:

    cp = ["N", "NNE", "NE", "ENE", "E", "ESE", "SE", "SSE",
            "S", "SSW", "SW", "WSW", "W", "WNW", "NW", "NNW"]
    

    我能够得到字典中的一组基本位置与完整列表之间的差异 cp

    for leg in legdict.values():
        print(list(set(cp) - set(leg.keys())))
        
    ['ESE', 'SSW', 'NNE', 'NE', 'ENE', 'SW', 'E']
    

    那么,如何用缺失的位置更新嵌套字典并将其值设置为0呢?输出如下:

      {'925328413719459770': {'N': 14,
          'NNW': 116,
          'NW': 38,
          'S': 1,
          'SE': 2,
          'SSE': 1,
          'W': 16,
          'WNW': 146,
          'WSW': 16,
          'ESE': 0, 
          'SSW': 0, 
          'NNE': 0, 
          'NE': 0, 
          'ENE':0, 
          'SW': 0, 
          'E': 0 }}
    

    在python中,有没有一种有效的方法可以使用 update() 方法,或者可以使用列表来更新dict,同时将该列表的所有元素设置为0吗?实际 legdict 非常大,因此关于有效方法的任何建议都将受到赞赏。

    1 回复  |  直到 5 年前
        1
  •  2
  •   Hubro    5 年前

    这个怎么样:

    cardinal_positions = [
        "N", "NNE", "NE", "ENE", "E", "ESE", "SE", "SSE",
        "S", "SSW", "SW", "WSW", "W", "WNW", "NW", "NNW"
    ]
    
    def fill_missing_keys(the_huge_dict):
        """Fills in missing cardinal positions with 0"""
    
        for inner_dict in the_huge_dict.values():
            for key in cardinal_positions:
                if key not in inner_dict:
                    inner_dict[key] = 0
    

    它应该相当高效,因为它不做任何复制,它只是迭代所有内容,并在必要时填充缺失的键。

    一般来说,你应该总是先选择最简单的解决方案。如果结果太慢,请稍后优化。