动态嵌套字典

Nic*_*ick 0 python sockets dictionary nested dynamic

首先,我知道这里有几个类似标题的问题,但没有一个问题是这样解释的,问题范围也不相同。

我想动态添加嵌套字典条目。

用例是:我有一个正在监视网络的 python 脚本。为每个观察到的 IP 协议(​​tcp、udp、icmp)创建一个字典。然后使用一个键创建一个子字典,该键是每个 IP 协议(​​80、443 等)的目标端口(如果存在)(请注意,它是否将服务器端口视为源端口并不重要)或目的地,但通常服务器是目的地,所以我选择 HTTP 和 HTTPS 作为示例)。对于每个目标端口,都会创建一个与服务器 IP(例如 www.google.com 的 IP)相对应的密钥。然后另一个字典,其中首先观察到的会话时间戳作为键,键的数据/值是客户端的 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> }
       }
   }
}
Run Code Online (Sandbox Code Playgroud)

谢谢!

Ant*_*nko 5

给你:

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)
Run Code Online (Sandbox Code Playgroud)

输出:

{'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'}
Run Code Online (Sandbox Code Playgroud)

如果您想存储和查询结果,我还建议您查看jsonand 。tinydb