【问题标题】:Update nested dict with missing key value pairs使用缺少键值对更新嵌套字典
【发布时间】:2021-05-04 14:01:17
【问题描述】:

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

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

但是,并非所有嵌套的 dicts 都会包含 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() 方法执行此操作,或者可以使用列表来更新字典,同时将该列表的所有元素设置为 0?实际的legdict 非常大,因此我们将不胜感激任何有关有效方法的建议。

【问题讨论】:

    标签: python dictionary nested key-value


    【解决方案1】:

    这个呢:

    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
    

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

    作为一般规则,您应该始终先选择最简单的解决方案。如果结果太慢,请稍后再优化。

    【讨论】:

    • @DanielHao 不,没有复制。原来的dicts被修改了:)
    猜你喜欢
    • 1970-01-01
    • 2011-07-02
    • 1970-01-01
    • 2019-07-15
    • 2021-09-04
    • 2021-04-14
    • 1970-01-01
    • 2022-01-25
    • 2017-05-05
    相关资源
    最近更新 更多