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,

Другие вопросы по тегам