根据另一个列表中的值操作字典列表

Pet*_*ent 1 python dictionary list

所以基本上我有三个这样的列表:

list1 = [{
    'IP' : "1.1.1.1", 
    'ID' : 1,
    },
    {
    'IP' : "2.2.2.2", 
    'ID' : 2
    }]

list2 = [{
    'vulnerability_id' : 4567, 
    'ID' : 1,
    },
    {
    'vulnerability_id' : 6578, 
    'ID' : 2
    }]

list3 = [{
    'vulnerability_id' : 4567, 
    'description' : 'blah',
    },
    {
    'vulnerability_id' : 6578, 
    'description' : 'blah blah'
    }]
Run Code Online (Sandbox Code Playgroud)

我需要做的是基于IP获取漏洞的描述,但这可能需要某种列表理解,我不知道如何去做.(并把它放在一本新词典中)

我需要检查我的IP值,比如1.1.1.1,然后将它的ID与list2进行比较,然后比较list3中关联的'vulnerability_id'.

任何帮助将不胜感激,如果这没有意义,请说,我会尝试和扩展.

Ant*_*rot 5

这在计算方面非常重要,但您只有列表作为数据源,因此,这是我的"解决方案":

results = []
for ip_info in list1:
    result = {}
    result['ip'] = ip_info['IP']
    result['vulnerability'] = next((
            vuln_info['vulnerability_id']
            for vuln_info in list2
            if vuln_info['ID'] == ip_info['ID']
        ),None)

    result['description'] = next((
            desc_info['description']
            for desc_info in list3
            if desc_info['vulnerability_id'] == result['vulnerability']
        ),None)

    results.append(result)
Run Code Online (Sandbox Code Playgroud)

结果:

[{'description': 'blah', 'ip': '1.1.1.1', 'vulnerability': 4567},
 {'description': 'blah blah', 'ip': '2.2.2.2', 'vulnerability': 6578}]
Run Code Online (Sandbox Code Playgroud)

编辑:根据我的答案改进和@Alex Hall回答:

def find(l, match, v, k):
    return next((x[k] for x in l if x[match] == v), None)

results = []
for ip_info in list1:
    ip = ip_info['IP']
    _id = ip_info['ID']
    vul = find(list2, 'ID', _id, 'vulnerability_id')
    desc = find(list3, 'vulnerability_id', vulnerability, 'description')    
    results.append(dict(ip=ip, vulnerability=vul, description=desc))
Run Code Online (Sandbox Code Playgroud)