【问题标题】:Replacing redundant key names across all dictionaries in a dictionary替换字典中所有字典的冗余键名
【发布时间】:2020-01-18 13:40:19
【问题描述】:

如何替换嵌套字典中的冗余键?

例如,如果我有以下嵌套循环:

nested_dict = { 
'dict1': {'key_As': 'value_A', 'key_B': 'value_B', 'key_C': 'value_C', 'key_D': 'value_D'}, 
'dict2': {'key_A': 'value_A', 'key_B': 'value_B', 'key_C': 'value_C', 'key_D': 'value_D'}, 
'dict3': {'key_A': 'value_A', 'key_Bs': 'value_B', 'key_C': 'value_C', 'key_D': 'value_D'},
...
'dictN': {'key_As': 'value_A', 'key_Bs': 'value_B', 'key_C': 'value_C', 'key_D': 'value_D'}
}

我想用“Key_A”替换所有“key_As”,用“Key_B”替换所有“Key_Bs”?

对于独立词典,我会执行以下操作:

dictionary['key_A'] = dictionary.pop('key_As')

但我不知道如何将它扩展到一个巨大的嵌套字典。

谢谢

【问题讨论】:

  • “计算优雅”对我来说似乎很不清楚和主观。你这是什么意思?您当前的解决方案存在什么样的性能/效率问题,您需要多少改进?您能否以minimal reproducible example 的身份描述并展示您为解决问题所做的努力?你提到了一个循环,但我只看到一本字典。感谢您的澄清。

标签: python dictionary nested key


【解决方案1】:
for i, d in nested_dict.items():
    nested_dict[i] = {{'key_As': 'key_A', 'key_Bs': 'key_B'}.get(k, k): v for k, v in d.items()}

nested_dict

{
  'dict1': {'key_A': 'value_A', 'key_B': 'value_B', 'key_C': 'value_C', 'key_D': 'value_D'}, 
  'dict2': {'key_A': 'value_A', 'key_B': 'value_B', 'key_C': 'value_C', 'key_D': 'value_D'}, 
  'dict3': {'key_A': 'value_A', 'key_B': 'value_B', 'key_C': 'value_C', 'key_D': 'value_D'}, 
  'dictN': {'key_A': 'value_A', 'key_B': 'value_B', 'key_C': 'value_C', 'key_D': 'value_D'}
}

【讨论】:

    【解决方案2】:

    你可以试试:

    old_new = {'key_As': 'key_A', 'key_Bs': 'key_B'}
    old_keys = set(old_new)    
    
    for value_dict in nested_dict.values():
        for old_key in set(value_dict) & old_keys:
            value_dict[old_new[old_key]] = value_dict.pop(old_key)
    

    我已经使用我的方法和@Krrr 的方法进行了性能测试:

    import timeit
    
    setup = """
    nested_dict = {f'dict1_{d}' : {'key_As': 'value_A', 'key_B': 'value_B', 'key_C': 'value_C', 'key_D': 'value_D'} for d in range(n)}
    nested_dict.update({ f'dict2_{d}' : {'key_A': 'value_A', 'key_B': 'value_B', 'key_C': 'value_C', 'key_D': 'value_D'} for d in range(n)})
    nested_dict.update({ f'dict3_{d}' : {'key_A': 'value_A', 'key_Bs': 'value_B', 'key_C': 'value_C', 'key_D': 'value_D'} for d in range(n)})
    
    def test_rusu():
        old_new = {'key_As': 'key_A', 'key_Bs': 'key_B'}
        old_keys = set(old_new)    
    
        for value_dict in nested_dict.values():
            for old_key in set(value_dict) & old_keys:
                value_dict[old_new[old_key]] = value_dict.pop(old_key)
    
    def test_Krrr():
        for i, d in nested_dict.items():
            nested_dict[i] = {{'key_As': 'key_A', 'key_Bs': 'key_B'}.get(k, k): v for k, v in d.items()}"""
    
    data = {i : (timeit.timeit('test_rusu()', setup= f'n={i}\n' + setup, number=100),
                 timeit.timeit('test_Krrr()', setup= f'n={i}\n' + setup, number=1000)) for i in (10, 100, 1_000, 10_000)}
    
    pd.DataFrame({'Number of nested dicts': [3 * e for e in data.keys()], "rusu's time(Seconds)": [round(e[0], 4) for e in data.values()],
                  "Krrr's time(seconds)": [round(e[1], 4) for e in data.values()]})
    

    输出:

    或:

    【讨论】:

      猜你喜欢
      • 2015-12-13
      • 1970-01-01
      • 2018-09-11
      • 2020-01-17
      • 2014-01-13
      • 2019-01-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多