【问题标题】:Match dictionaries using nested comprehension使用嵌套推导匹配字典
【发布时间】:2020-08-20 11:36:36
【问题描述】:

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

我正在努力想出一种简约的方法来获得精确匹配。这里最好的方法是什么?

【问题讨论】:

  • 看来disks是个集合吧?
  • @jizhihaoSAMA 是一个以size为key,value为list的dict
  • 这并没有真正回答这个问题,但我认为现在是建立一个合适的模型而不是使用它们之间隐含关系的字典的正确时机。

标签: python list-comprehension dictionary-comprehension


【解决方案1】:

我自己想通了,但我确信它可以做得更整洁,所以仍然欢迎输入。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-20
    • 1970-01-01
    • 2019-07-05
    • 1970-01-01
    相关资源
    最近更新 更多