首页 > 解决方案 > 根据键值拆分嵌套字典

问题描述

谁能给我一个提示,告诉我如何根据一个名为的公共键名score和 的值将嵌套字典拆分为单独的嵌套字典score

例如分解这个嵌套字典nested_group_map_original

nested_group_map_original = {
    'group_l1n': {'score': 0.12949562072753906, 'VMA-1-1': '14', 'VMA-1-2': '13', 'VMA-1-3': '15', 'VMA-1-4': '11', 'VMA-1-5': '9', 'VMA-1-7': '7', 'VMA-1-10': '21', 'VMA-1-11': '16'}, 
    'group_l1s': {'score': -0.40303707122802734, 'VMA-1-6': '8', 'VMA-1-8': '6', 'VMA-1-9': '10', 'VMA-1-12': '19', 'VMA-1-13': '20', 'VMA-1-14': '37', 'VMA-1-15': '38', 'VMA-1-16': '39'}, 
    'group_l2n': {'score': 0.6091512680053768, 'VAV-2-1': '12032', 'VAV-2-2': '12033', 'VMA-2-3': '31', 'VMA-2-4': '29', 'VAV-2-5': '12028', 'VMA-2-6': '27', 'VMA-2-7': '30', 'VMA-2-12': '26'}, 
    'group_l2s': {'score': 0.11078681945799929, 'VMA-2-8': '34', 'VAV-2-9': '12035', 'VMA-2-10': '36', 'VMA-2-11': '25', 'VMA-2-13': '23', 'VMA-2-14': '24'}
               }

使它看起来像下面这样,但以编程方式用于两个名为nested_group_map_copy_lowsand的单独嵌套字典nested_group_map_copy_high

nested_group_map_copy_lows = {
    'group_l1s': {'score': -0.40303707122802734, 'VMA-1-6': '8', 'VMA-1-8': '6', 'VMA-1-9': '10', 'VMA-1-12': '19', 'VMA-1-13': '20', 'VMA-1-14': '37', 'VMA-1-15': '38', 'VMA-1-16': '39'}, 
    'group_l2s': {'score': 0.11078681945799929, 'VMA-2-8': '34', 'VAV-2-9': '12035', 'VMA-2-10': '36', 'VMA-2-11': '25', 'VMA-2-13': '23', 'VMA-2-14': '24'}
                   }

nested_group_map_copy_highs = {
    'group_l2n': {'score': 0.6091512680053768, 'VAV-2-1': '12032', 'VAV-2-2': '12033', 'VMA-2-3': '31', 'VMA-2-4': '29', 'VAV-2-5': '12028', 'VMA-2-6': '27', 'VMA-2-7': '30', 'VMA-2-12': '26'},
    'group_l1n': {'score': 0.12949562072753906, 'VMA-1-1': '14', 'VMA-1-2': '13', 'VMA-1-3': '15', 'VMA-1-4': '11', 'VMA-1-5': '9', 'VMA-1-7': '7', 'VMA-1-10': '21', 'VMA-1-11': '16'},     
                   }

不太确定如何解决这个问题,我想我需要用它enumerate来创建全新的字典,但如果我尝试在单独的列表中找到最高分scores_

scores_ = []
for i in nested_group_map_original:
    scores_.append(nested_group_map_original[i]["score"])
    
scores_sorted = sorted(scores_, key = float)

然后切片最高和最低值:

scores_sorted_highs = scores_sorted[2:]
scores_sorted_lows = scores_sorted[:2]

我被困在这里,我不认为这del是要走的路,非常感谢任何提示......我知道在我的代码中我什至没有定义我认为我可以用 Python 做的新字典,enumerate但不知道如何实现它

for i in nested_group_map_original:
    if nested_group_map_original[i]["score"] in scores_sorted_highs:
        del nested_group_map_original[i]

这会出错:

RuntimeError: dictionary changed size during iteration

标签: pythondictionary

解决方案


您可以根据其对应的分数对原始字典的键进行排序,如下所示:

sorted_keys = sorted(nested_group_map_original, key = lambda x: nested_group_map_original[x]['score'])

然后,您可以根据每个字典中所需的值数量将其拆分为两个不同的字典。就像在您的两个示例中一样,您可以执行以下操作:

scores_sorted_lows = {k:nested_group_map_original[k] for k in sorted_keys[:2]}
scores_sorted_highs = {k:nested_group_map_original[k] for k in sorted_keys[2:]}

推荐阅读