所以基本上我有三个这样的列表:
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'。
任何帮助都将非常感激,如果这没有意义,请说,我会尝试扩展。
答案 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来处理合并函数来处理多余的重叠),但是对于这种情况它很有效:)。缺点是它确实需要安装外部封装,而上述两种解决方案则不需要。