Динамические вложенные словари

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

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

Вариант использования таков: у меня есть скрипт на python, который контролирует сеть. Словарь создается для каждого наблюдаемого протокола IP (tcp, udp, icmp), который наблюдается. Затем создается подсловарь с ключом, который является портом назначения (если таковой существует) для каждого из этих протоколов IP (80, 443 и т. Д.) (Обратите внимание, не имеет значения, видит ли он порт сервера в качестве источника или назначение, но обычно серверы являются назначением, поэтому я выбрал HTTP и HTTPS в качестве примеров). Для каждого из этих портов назначения создается ключ, соответствующий IP-адресу сервера (например, IP-адресу для www.google.com). И затем другой словарь с меткой времени сеанса сначала наблюдался как ключ, а данные / значение для ключа были IP-адресом клиента.

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

Вывод будет выглядеть примерно так:

{  'icmp' :
   {  'echo-request' :
       {  '<ip_of_www.google.com>' :
           {   '<timestamp>' : <some_client_ip> }
       }
      'echo-reply' :
       {  '<ip_of_www.google.com>' :
           {   '<timestamp>' : <some_client_ip> }
       }
   }
   'tcp' :
   {
      '80' 
       {  '<ip_of_www.google.com>' :
           {   '<timestamp>' : <some_client_ip> }
           {   '<timestamp>' : <some_client_ip> }
       }
      '443' 
       {  '<ip_of_encrypted.google.com>' :
           {   '<timestamp>' : <some_client_ip> }
           {   '<timestamp>' : <some_client_ip> }
           {   '<timestamp>' : <some_client_ip> }
           {   '<timestamp>' : <some_client_ip> }
       }
   }
}

Спасибо!

1 ответ

Вот ты где:

def set_nested(dict, value, *path):
    for level in path[:-1]:
        dict = dict.setdefault(level, {})

    dict[path[-1]] = value


d = {}

set_nested(d, '127.0.0.1', 'icmp', 'echo', 'google.com', '1 dec 2014')
set_nested(d, '127.0.0.1', 'icmp', 'echo', 'google.com', '2 dec 2014')
set_nested(d, '127.0.0.1', 'icmp', 'echo', 'yahoo.com', '2 dec 2014')
set_nested(d, 'error', 'udp')

from pprint import pprint
pprint(d)

Выход:

{'icmp': {'echo': {'google.com': {'1 dec 2014': '127.0.0.1',
                                  '2 dec 2014': '127.0.0.1'},
                   'yahoo.com': {'2 dec 2014': '127.0.0.1'}}},
 'udp': 'error'}

Я бы также предложил вам взглянуть на json а также tinydb если вы хотите сохранить и запросить результаты.

Другие вопросы по тегам