根据常见键值并结合列表的嵌套字典合并字典列表

时间:2020-07-10 03:40:40

标签: python dictionary

试图缠住我的头(感觉)是一种过于复杂的字典/列表,无法表示项目之间的关系。

mappings = [{'switches': ['switch1', 'switch2'], 'relationships': [{'compute_name': 'compute001', 'servers': ['server1', 'server2']}]},
            {'switches': ['switch1', 'switch2'], 'relationships': [{'compute_name': 'compute002', 'servers': ['server3', 'server4']}]},
            {'switches': ['switch3', 'switch4'], 'relationships': [{'compute_name': 'compute003', 'servers': ['server5', 'server6']}]},
            {'switches': ['switch3', 'switch4'], 'relationships': [{'compute_name': 'compute004', 'servers': ['server7', 'server8', 'server9']}]},
            {'switches': ['switch5', 'switch6'], 'relationships': [{'compute_name': 'compute005', 'servers': ['server10', 'server11', 'server12']}]},
            {'switches': ['switch5', 'switch6'], 'relationships': [{'compute_name': 'compute006', 'servers': ['server13', 'server14', 'server15', 'server16']}]}]

如您所见,它是一个字典列表,其中的值有时是另一个字典列表。

我遇到的问题是起始数据包含“重复项”。例如,如果查看“ switches”的键值,则可以看到包含“ switch1” +“ switch2”的列表出现了两次。由于关系数据是唯一的,因此有效。

我想找到一种方法,将字典转换成如下形式:

end_mapping = [{'switches': ['switch1', 'switch2'], 'relationships': [{'compute_name': 'compute001', 'servers': ['server1', 'server2']},
                                                                      {'compute_name': 'compute002', 'servers': ['server3', 'server4']}]},
               {'switches': ['switch3', 'switch4'], 'relationships': [{'compute_name': 'compute003', 'servers': ['server5', 'server6']},
                                                                      {'compute_name': 'compute004', 'servers': ['server7', 'server8', 'server9']}]},
               {'switches': ['switch5', 'switch6'], 'relationships': [{'compute_name': 'compute005', 'servers': ['server10', 'server11', 'server12']},
                                                                      {'compute_name': 'compute006', 'servers': ['server13', 'server14', 'server15', 'server16']}]}
              ]

在此数据集中,开关的键值是唯一的,我已经“合并”了关系字典。

我一直在努力解决这个问题,但到目前为止还没有找到办法。

我的起点是:

new_list_of_dict = []
for mapping_dict_a in mappings:
    for mapping_dict_b in mappings:
        if set(mapping_dict_b['switches']) == set(mapping_dict_a['switches']):
            same = True
            mapping_dict_a['relationships'].append(mapping_dict_b['relationships'])
            new_list_of_dict.append(mapping_dict_a)
            break
        else:
            same = False
            print('NOT SAME!')

但是到目前为止,它还不能正常工作(我确定这是错误的;)-我最终在final_dict中遇到了无限循环或太多数据的情况。

有什么提示吗?

谢谢!

2 个答案:

答案 0 :(得分:1)

嘿,所以我想出了一些应该可行的方法,尽管这是一个hack。让我知道怎么回事。

unique_mapping

[{'switches': ['switch5', 'switch6'], 'relationships': [[{'compute_name': 'compute005', 'servers': ['server10', 'server11', 'server12']}], [{'compute_name': 'compute006', 'servers': ['server13', 'server14', 'server15', 'server16']}]]}, {'switches': ['switch1', 'switch2'], 'relationships': [[{'compute_name': 'compute001', 'servers': ['server1', 'server2']}], [{'compute_name': 'compute002', 'servers': ['server3', 'server4']}]]}, {'switches': ['switch3', 'switch4'], 'relationships': [[{'compute_name': 'compute003', 'servers': ['server5', 'server6']}], [{'compute_name': 'compute004', 'servers': ['server7', 'server8', 'server9']}]]}] 应该导致:

apply plugin: 'com.google.gms.google-services'

答案 1 :(得分:0)

这是使用frozenset的一种方法,以及为什么frozenset不是set引用此帖子unhashable type: 'set'

results = {}

for v in mappings:
    key = frozenset(v['switches'])

    if results.get(key):
        results[key]['relationships'].append(v['relationships'])
    else:
        results[key] = v

print(list(results.values()))
[{'relationships': [{'compute_name': 'compute001',
                     'servers': ['server1', 'server2']},
                    [{'compute_name': 'compute002',
                      'servers': ['server3', 'server4']}]],
  'switches': ['switch1', 'switch2']},
...
}]