2016-05-21 13 views
1

Also im Grunde habe ich drei Listen wie so:Manipulieren eine Liste der Wörterbücher auf Werte in einer anderen Liste basiert

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

Was muss ich tun bekommen, ist die Beschreibung einer Schwachstelle basiert auf einem IP aber wahrscheinlich erfordert eine Art Listenverständnis und ich bin mir nicht sicher, wie ich das anstellen soll. (Und in ein neues Wörterbuch einfügen)

Ich muss den IP-Wert überprüfen, sagen wir 1.1.1.1, dann vergleiche seine ID mit list2, dann vergleiche die zugehörige 'vulnerability_id' in list3.

Jede Hilfe würde sehr geschätzt werden, wenn dies keinen Sinn ergibt, bitte sagen und ich werde versuchen und erweitern.

+0

Berücksichtigt man, dass Listen mit der Elementnummernliste [0] list [1] erreicht werden können, wird ein Wörterbuch mit einem Schlüssel: Wertpaar zurückgegeben, wenn Sie über list1 iterieren und dann entweder den Schlüssel oder den Wert aus den Wörterbüchern vergleichen von Liste 2 und 3? Kennen Sie Python-Listen und -Dokumente? Welche Version von Python benutzt du? Haben Sie einen Code dazu versucht? – glls

+0

Ich lerne gerade, ich habe kein Problem, Werte auf einer Liste zu überprüfen, die auch in einem anderen sind. Aber ich verstehe einfach nicht, wie man "IP" mit "ID" assoziiert, so dass ich über list2 iterieren kann, um zu sehen, ob meine benötigte ID existiert, und dann dasselbe mit list3 und 'vulnerability_id'. (Ich benutze 2.6) –

+0

ok, wie gesagt. Auf das erste Dictionary von list1 kann wie folgt zugegriffen werden list1 [0] und um Dictionary-Operationen mit (key: value) durchzuführen, können Sie beginnen, indem Sie dies lesen: http://www.tutorialspoint.com/python/python_dictionary.htm und versuchen Sie es Code aus und fügen Sie es zu Ihrem Beitrag – glls

Antwort

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']) 
5

Dies ist in Bezug auf die Rechen wirklich schwer, aber Sie nur Listen als Datenquellen haben, so, hier ist meine "Lösung":

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) 

Ergebnisse:

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

EDIT: Verbesserung basierend auf meiner Antwort und @Alex Hall Antwort:

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)) 
+0

Hallo, ich habe die erste Antwort angenommen, die dort gepostet wurde, aber ich schätze deine auch sehr. Entschuldigung, ich konnte es nicht akzeptieren! –

4

Für solche Dinge mag ich das Pandas Paket. Ich war in der Lage, so etwas zu tun:

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 

Dies wird Ihnen auch am Ende dieses schön formatierte Tabelle geben. Ohne zusätzliche Arbeit von Ihrer Seite! Die Zusammenführungsoperation nutzt den Vorteil, wie gut Ihre Wörterbuchschlüssel benannt sind. Da list1 und list2 beide id gemeinsam haben, führt sie im Wesentlichen einen inneren Join in der ID-Spalte aus. Dann verwendet die Spalte vulnerability_id des sich ergebenden Rahmens, um sich mit list3 zu verbinden. Dies wird komplizierter, wenn Sie mehr als einen gemeinsamen Schlüssel haben (in dem Sinne, dass Sie mit einigen der Kwarts herumspielen müssen, damit die Merge-Funktion die überschüssige Überlappung bewältigen kann), aber für diese Situation funktioniert es großartig :). Der Nachteil ist, dass es die Installation eines externen Pakets erfordert, während die beiden oben genannten Lösungen dies nicht tun.

Verwandte Themen