使用嵌套理解匹配字典

Match dictionaries using nested comprehension

我正在尝试将具有预定义 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', 'disks' : 2, 'block' : 300}, {'name' : 'data3', 'disks' : 2, 'block' : 1800},  {'name' : 'data', 'disks' : 8, 'block' : 300}],
  'server4': [{'name' : 'data', 'disks' : 3, 'block' : 300}, {{'name' : 'data2', 'disks' : 8, '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