Python - 搜索词典

Bit*_*ket 2 python search dictionary

样本数据:

{
    10116079620: {'ip.dst': ['10.1.1.5'], 'ip.src': ['1.2.3.4'], 'category': ['Misc']}, 
    10116882439: {'ip.dst': ['1.2.3.4'], 'ip.src': ['10.1.1.5'], 'category': ['Misc']}, 
    10116080136: {'ip.dst': ['10.10.10.99'], 'ip.src': ['1.2.3.4'], 'category': ['Misc']}, 
    10116884490: {'ip.dst': ['10.10.10.99'], 'ip.src': ['2.3.4.5'], 'alias': ['www.example.com'], 'category': ['Misc']}, 
    10117039635: {'ip.dst': ['2.3.4.5'], 'ip.src': ['10.11.11.50'], 'alias': ['google.com'], 'category': ['Misc']}, 
    10118099993: {'ip.dst': ['1.2.3.4'], 'ip.src': ['10.11.11.49'], 'alias': ['www.google.com'], 'category': ['Misc']},
    10118083243: {'ip.dst': ['10.11.11.49'], 'ip.src': ['4.3.2.1'], 'alias': ['www.google.com'], 'category': ['Misc']}}
}
Run Code Online (Sandbox Code Playgroud)

目标:

我的目标是使用已知存在的值(IP地址)搜索示例字典,尽管不知道它是否会出现在ip.dst或ip.src中.一旦找到,我想将"对面"(其他)IP地址写入新列表...如果在ip.src中找到搜索到的地址,我想捕获ip.dst,反之亦然.

可以多次找到搜索到的地址 - 结果列表不需要反映重复项.

如果搜索到1.2.3.4,则会捕获以下内容:
*10.1.1.5
*10.10.10.99
*10.11.11.49

搜索10.10.10.99将捕获:
*1.2.3.4
*2.3.4.5

我确信这很简单,但我遇到了令人讨厌的嵌套循环,需要一个比我的泥更清晰的简洁程序.

非常感谢您的协助.

谢谢.

S.L*_*ott 5

步骤1.反转字典.

dst= collections.defaultdict( list )
src= collections.defaultdict( list )
for k in original:
    for addr in original[k]['ip.dst']:
        dst[addr].append( k )
    for addr in original[k]['ip.src']:
        src[addr].append( k )
Run Code Online (Sandbox Code Playgroud)

第2步.不要搜索,只需获取值.

您可以进行两次即时检查dst[addr],src[addr]并且您知道原始字典中发生的所有密钥.

翻译字典需要时间.

首先构建更好的字典(即,通过ip.dst和ip.src索引)可以节省反转已有字典的成本.