使用嵌套理解匹配字典

问题描述

我正在尝试将具有预定义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