matches = []
for ip1 in phase1_hits:
subdict1 = phase1_hits[ip1]
internal_ips = [subdict1['internal']] + subdict1['internal_additional']
hits = subdict1['hits']
color_list = subdict1['list']
for ip2 in phase2_hits:
subdict2 = phase2_hits[ip2]
phase2_ips = subdict2['ip.dst'] + subdict2['ip.src']
overlap = [i for i in internal_ips if i in phase2_ips]
if len(overlap) > 0:
temp = (ip1, overlap, hits, color_list, ip2, [i for i in phase2_ips if i in overlap])
matches.append(temp)
Вот объяснение:
matches = []
Вам необходимо хранить данные где-то, где вы сможете изменить / использовать их позже. Список является самым простым, поскольку он может легко изменять размер в соответствии с имеющимися у вас данными и количеством изменяющихся элементов. Хотя словарь выполним, он не будет очень эффективным, особенно если вы ищете одиночные совпадения и не пытаетесь создать указатели на конкретные данные.
for ip1 in phase1_hits:
Вы можете перемещаться по клавишам в словаре, рассматривая его как список (т. Е. Вызывать функцию .keys()
не нужно, поскольку вы не меняете / удаляете ключи в словаре).
subdict1 = phase1_hits[ip1]
internal_ips = [subdict1['internal']] + subdict1['internal_additional']
hits = subdict1['hits']
color_list = subdict1['list']
Я добавил псевдоним для удобства чтения; это, однако, не обязательно. В следующей строке я воспользовался собственным списком Python __add__
, который просто добавляет элементы одного списка к другому и создает новый список, потому что internal_ips
может иногда иметь несколько элементов. Затем, поскольку вы хотите получить число hits
и значение 'list'
в поддикте, я создал color_list
. Обратите внимание, что я не назвал его так же, как ключ, потому что это конфликтовало бы с собственным пространством имен Python для типа переменной list
.
for ip2 in phase2_hits:
subdict2 = phase2_hits[ip2]
phase2_ips = subdict2['ip.dst'] + subdict2['ip.src']
overlap = [i for i in internal_ips if i in phase2_ips]
Единственная новая вещь здесь - overlap
. Используя генератор списков, мы можем найти все перекрывающиеся значения (отсюда и название). Вы можете называть это как хотите; просто знайте, что он будет заполнен всеми общими ценностями между ними. (Вы также можете использовать это: формула в основном [i for i in L1 if i in L2]
, где L1
и L2
оба списка.)
if len(overlap) > 0:
temp = (ip1, overlap, hits, color_list, ip2, [i for i in phase2_ips if i in overlap])
matches.append(temp)
Оператор if
гарантирует, что существует как минимум одно перекрытие между phase1_hits
внутренним или внутренним_дополнительным IP и phase2_hits
. Если это так, он будет заполнять кортеж (который является неизменным) на основе этой информации. (Я выбрал кортеж, поскольку он неизменен, и вы знаете его структуру, но вы можете изменить его в список, если хотите.) После заполнения он добавляется в список matches
.
После прохождения обоих циклов у вас должно быть то, что вы хотите.