基于公共键值合并字典列表,但使用嵌套的列表目录

2024-05-17 15:04:08 发布

您现在位置:Python中文网/ 问答频道 /正文

试图将我的头脑(我的感觉)缠绕在一起是一种过于复杂的方式,无法表示项目之间的关系

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']}]}]

如您所见,这是一个dict列表,其中的值有时是另一个dict列表

我遇到的问题是,起始数据包含“重复项”。例如,如果查看“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!')

但是到目前为止它还不起作用(我肯定这是错误的;)-最终我要么得到一个无限循环,要么最终得到的数据太多

有什么建议吗

谢谢


Tags: name列表mappingdictmappingscomputeserversrelationships
2条回答

嘿,所以我想出了一些应该有效的方法,尽管这是一个黑客。让我知道进展如何

# given the mappings var you provided in your example:
switches = [item.get('switches') for item in mappings]
unique_switches = [list(x) for x in set(tuple(x) for x in switches)]

unique_mapping = []
for switch in unique_switches:
    relationship_list = []
    for item in mappings:
        if item.get('switches') == switch:
            relationship_list.append(item['relationships'])
    unique_mapping.append({'switches': switch, 'relationships': relationship_list})

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']}]]}]

下面是一种使用^{}&;为什么frozensetset参考这篇文章^{}

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']},
...
}]

相关问题 更多 >