使用嵌套理解匹配字典
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
我正在尝试将具有预定义 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