试图缠住我的头(感觉)是一种过于复杂的字典/列表,无法表示项目之间的关系。
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中遇到了无限循环或太多数据的情况。
有什么提示吗?
谢谢!
答案 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']},
...
}]