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

时间:2016-05-21 21:13:22

标签: python list dictionary

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

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'
    }]

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

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

任何帮助都将非常感激,如果这没有意义,请说,我会尝试扩展。

3 个答案:

答案 0 :(得分:5)

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

Open in Browser

结果:

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)

编辑:基于我的回答和@Alex Hall答案的改进:

[{'description': 'blah', 'ip': '1.1.1.1', 'vulnerability': 4567},
 {'description': 'blah blah', 'ip': '2.2.2.2', 'vulnerability': 6578}]

答案 1 :(得分:4)

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'
    }]


def find(data, key, value):
    for row in data:
        if row[key] == value:
            return row
    raise ValueError('Row with %s = %s not found' % (key, value))


ID = find(list1, 'IP', '1.1.1.1')['ID']
vulnerability_id = find(list2, 'ID', ID)['vulnerability_id']
print(find(list3, 'vulnerability_id', vulnerability_id)['description'])

答案 2 :(得分:4)

对于这样的事情,我真的很喜欢使用pandas包。我能够做到这样的事情:

import pandas as pd

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'
}]

df_1 = pd.DataFrame(list1)
df_2 = pd.DataFrame(list2)
df_3 = pd.DataFrame(list3)

output = df_1.merge(df_2).merge(df_3)

print output

ID       IP  vulnerability_id description
 1  1.1.1.1              4567        blah
 2  2.2.2.2              6578   blah blah

这也将为您提供格式良好的表格。没有额外的工作!合并操作利用了您的字典键的命名方式。由于list1和list2都具有共同的id,因此它实际上在id列上执行内部连接。然后使用结果框架的vulnerability_id列与list3连接。当你有多个公共密钥时,这会变得更加复杂(在某种意义上,你必须使用一些kwargs来处理合并函数来处理多余的重叠),但是对于这种情况它很有效:)。缺点是它确实需要安装外部封装,而上述两种解决方案则不需要。