Python словарь с кортежем и количеством кортежей в качестве значения
У меня есть .csv
file: csv-файл, содержащий данные заголовка пакета из сканирования Wireshark, которые я перебираю построчно с циклом for. Список содержит около 100000 пунктов, многие из которых повторяются. Я пытаюсь выяснить, сколько раз к каждому IP-адресу получателя обращаются по протоколу TCP (6) на каждый порт в диапазоне от 1 до 1024. По сути, я пытаюсь создать что-то похожее на это:
{ip address: {(protocol:port):count}}
Где я буду знать, сколько раз комбинация протокола / порта пыталась использовать IP-адрес в качестве пункта назначения. Пока я пробовал это:
dst = defaultdict(list)
for pkt in csvfile:
if(pkt.tcpdport > 0 and pkt.tcpdport < 1025):
tup = (pkt.proto, pkt.tcpdport)
dst[pkt.ipdst].append(tup)
Когда я пытаюсь распечатать это, я получаю список IP-адресов с протоколом, список портов указывается несколько раз для каждого IP-адреса. Как я могу получить его, чтобы я показывал кортеж, а затем подсчитывал, сколько раз он встречается в каждой записи словаря?
1 ответ
В настоящее время линия dst[pkt.ipdst].append(tup)
говорит python
получите значение, связанное с IP-адресом, а затем добавьте к нему кортеж. В этом случае это означает, что вы добавляете кортеж в словарь, связанный с IP-адресом. Вот почему вы видите несколько кортежей в списке для каждого IP-адреса.
Чтобы это исправить, просто измените свою строку на dst[pkt.ipdst][tup] += 1
, Это говорит python
чтобы получить словарь, связанный с IP-адресом, получите счетчик, связанный с кортежем в этом словаре, а затем добавьте 1. При печати это должно выглядеть так, как задумано.
Также определите dst
как defaultdict(lambda:defaultdict(dict))
так что в случае, если протокол, комбинация портов не была опробована, она не выдаст KeyError
,