Python 基于公共键值合并字典列表,但使用嵌套的列表目录
试图将我的头脑(我的感觉)缠绕在一起是一种过于复杂的方式,无法表示项目之间的关系Python 基于公共键值合并字典列表,但使用嵌套的列表目录,python,dictionary,Python,Dictionary,试图将我的头脑(我的感觉)缠绕在一起是一种过于复杂的方式,无法表示项目之间的关系 mappings = [{'switches': ['switch1', 'switch2'], 'relationships': [{'compute_name': 'compute001', 'servers': ['server1', 'server2']}]}, {'switches': ['switch1', 'switch2'], 'relationships': [{'comp
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!')
但是到目前为止它还不起作用(我肯定这是错误的;)-最终我要么得到一个无限循环,要么最终得到的数据太多
有什么建议吗
谢谢 嘿,所以我想出了一个应该有效的方法,尽管这是一个破解。让我知道进展如何
# 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})
唯一映射应导致:
[{'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']}]]}]
下面是一种使用&whyfrozenset
notset
的方法,请参阅本文
你做过调试吗?知道问题在哪里吗?很酷的解决方案,但如果您在Jupyter笔记本环境中运行此代码段,例如,关系键将随着初始关系列表中的终端项而增长。@IraH。这可能是由于对象具有相同的ref,您可以通过使用deepcopyimport-copy来修复它;copy.deepcopy(v['relationships'])
然后追加。
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']},
...
}]