1

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

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

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')

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

谢谢

4

2 回答 2

0

你可以试试:

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()]})

输出:

在此处输入图像描述

或者:

在此处输入图像描述

于 2019-09-17T16:44:47.873 回答
0
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'}
}
于 2019-09-17T16:56:48.517 回答