问题描述
我正在尝试将具有预定义RAID配置的字典与包含物理磁盘布局的字典进行匹配。
raid_config =
{ 'server1': [{'name' : 'data','disks' : 3,'block' : 300}],'server2': [{'name' : 'data','disks' : 8,'block' : 2200}],'server3': [{'name' : 'data','disks' : 2,'block' : 300},{'name' : 'data2',{'name' : 'data3','block' : 1800},{'name' : 'data','server4': [{'name' : 'data',{{'name' : 'data2','block' : 880}]
}
disks =
{300: ['bay0','bay1',bay10'],880: ['bay2','bay3','bay4','bay5','bay6','bay7','bay8','bay9']}
以前,我写了一篇理解文章,总结了RAID配置和物理磁盘的磁盘大小并进行了匹配。这将不再起作用,因为这将导致针对不同布局的多次匹配。
print({sum(v['disks']*v['size'] for v in vs) : k for k,vs in raid_config.items()}.get(sum(k*v for k,v in {k : len(v) for k,v in disks.items()}.items())))
-->
server4
我正在努力提出一种简约的方法来获得精确匹配。最好的方法是什么?
解决方法
我自己弄清楚了,但是我敢肯定它可以做得更整洁一些,因此仍然欢迎大家输入。
configs = {}
for k,v in raid_config.items():
configs[k] = {}
for d in v:
if d.get('size') in configs[k]:
configs[k][d.get('size')] += d.get('disks')
else:
configs[k][d.get('size')] = d.get('disks')
^-非常确定可以在一行中完成
这将导致:
{'server1': {300: 3},'server2': {2200: 8},'server3': {300: 12,1800: 2},'server4': {300: 3,880: 8}}
找到匹配的配置:
for k,v in configs.items():
if disks == v:
print(k)
结果:
server4