Как я могу создать один словарь из словарей в словаре с несколькими разными и похожими ключами - PullRequest
0 голосов
/ 22 июня 2019

У меня есть словарь, имеющий два значения ключа, и каждый ключ относится к значению, которое является самим словарем.Теперь моя задача - извлечь значения ключей из значений независимо от их первого ключа.И эти два значения имеют ключи как одинаковые, так и разные.

Мне нужно получить один словарь, в котором разные ключи остаются одинаковыми, а ключи одинаковы в обоих словарях, поэтому значения обновляются, т.е. они складываются.

with open('report.json') as json_file:
    data = json.load(json_file)
    print(data['behavior']['apistats'])

Выводсостоит из этого:

{
    "2740": {
        "NtDuplicateObject": 2,
        "NtOpenSection": 1,
        "GetSystemWindowsDirectoryW": 23,
        "NtQueryValueKey": 32,
        "NtClose": 427,
        "NtOpenMutant": 2,
        "RegCloseKey": 8
    },
    "3908": {
        "RegCreateKeyExW": 2,
        "GetNativeSystemInfo": 1,
        "NtOpenSection": 1,
        "CoUninitialize": 6,
        "RegCloseKey": 27,
        "GetSystemInfo": 1,
        "CreateToolhelp32Snapshot": 180,
        "UnhookWindowsHookEx": 2,
        "GetSystemWindowsDirectoryW": 6,
        "NtQueryValueKey": 6,
        "NtClose": 427
    }
}

Но мне нужен один словарь, в котором одно и то же значение 'apistats' складывается как новое значение, а ключи не повторяются, независимо от родительских ключей '2740' и '3908'.

1 Ответ

0 голосов
/ 22 июня 2019

Вы можете решить это с помощью groupby:

input_dict = {
    "2740": {
        "NtDuplicateObject": 2,
        "NtOpenSection": 1,
        "GetSystemWindowsDirectoryW": 23,
        "NtQueryValueKey": 32,
        "NtClose": 427,
        "NtOpenMutant": 2,
        "RegCloseKey": 8,
    },
    "3908": {
        "RegCreateKeyExW": 2,
        "GetNativeSystemInfo": 1,
        "NtOpenSection": 1,
        "CoUninitialize": 6,
        "RegCloseKey": 27,
        "GetSystemInfo": 1,
        "CreateToolhelp32Snapshot": 180,
        "UnhookWindowsHookEx": 2,
        "GetSystemWindowsDirectoryW": 6,
        "NtQueryValueKey": 6,
        "NtClose": 427,
    },
}

from itertools import groupby
from operator import itemgetter

refactored_items = ((k2, v2) for v1 in input_dict.values() for k2, v2 in v1.items())
sorted_refactored_items = sorted(refactored_items, key=itemgetter(0))
res = {k: sum(i for _, i in g) for k, g in groupby(sorted_refactored_items, key=itemgetter(0))}

res:

{'CoUninitialize': 6,
 'CreateToolhelp32Snapshot': 180,
 'GetNativeSystemInfo': 1,
 'GetSystemInfo': 1,
 'GetSystemWindowsDirectoryW': 29,
 'NtClose': 854,
 'NtDuplicateObject': 2,
 'NtOpenMutant': 2,
 'NtOpenSection': 2,
 'NtQueryValueKey': 38,
 'RegCloseKey': 35,
 'RegCreateKeyExW': 2,
 'UnhookWindowsHookEx': 2}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...