Суммируйте значения ключа во вложенном словаре - PullRequest
1 голос
/ 10 апреля 2020

Я пытаюсь рассчитать общее количество дисков для каждого сервера, данные хранятся следующим образом:

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}]
}

Я придумал:

for k,v in config.items():
    no_disks = 0
    for l in v:
        no_disks+= l.get('disks')
    print({k:no_disks})

Какие результаты в:

{'server1': 3}
{'server2': 8}
{'server3': 14}
{'server4': 11}

Я пытался сделать это в один лайнер, используя понимание dict, но не могу понять, какие-либо предложения для более элегантного решения?

1 Ответ

4 голосов
/ 10 апреля 2020

Вы можете сделать:

from operator import itemgetter

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 = itemgetter('disks')
result = { k : sum(disks(v) for v in vs) for k, vs in config.items()}
print(result)

Вывод

{'server1': 3, 'server2': 8, 'server3': 14, 'server4': 11}

Или просто получить прямой доступ к элементу:

result = { k : sum(v['disks'] for v in vs) for k, vs in config.items()}

Выше понимание словаря эквивалентно этому для l oop:

result = {}
for k, vs in config.items():
    result[k] = sum(v['disks'] for v in vs)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...