2016-08-31 6 views
0

Доброго дня,Python: DeDup словарь

Я читала в PCAP, и я в основном пытаюсь получить dedup'd список BSSID-х & ESSID лет. Я до сих пор получаю дубликаты с этим кодом и не могу за жизнь мне понять, что я делаю неправильно:

if not (t[0] in ssid_pairs and ssid_pairs[t[0]] == t[1]): 
    ssid_pairs[t[0]] = t[1] 
    of.write(t[0] + ',' + t[1] + ((',' + f + '\n') if verbose else '\n')) 

ssid_pairs является словарем, т [0] является BSSID & т [1] является ESSID , Пример словаря:

{'FF:FF:FF:FF:FF:FF':'MyWIFI',...} 

Я до сих пор видим несколько экземпляров одного и того же пары кнопочная> значение записывается в файл. Я помещаю некоторые отладочные операторы печати, и иногда он распознает дубликат, иногда это не будет. Это из parse pcap с scapy.

Спасибо за любую помощь.

*** EDIT: Спасибо всем, я не очень правильно решаю свою проблему с помощью словаря. Время думать, что это через немного понятнее ...

+2

Пожалуйста, добавьте пример словаря. –

+0

Обратите внимание, что словари уже уникальны, поскольку каждый ключ уникален. «Дедублирование» словаря не имеет смысла. Попробуйте: '{'FF: FF: FF: FF: FF: FF': 'MyWIFI', 'FF: FF: FF: FF: FF: FF': 'MySecondWIFI'}' дает просто '{'FF: FF : FF: FF: FF: FF ':' MySecondWIFI '} '. Если вы хотите дедуплировать отдельные списки, это совсем другое дело. Просьба уточнить ваш вопрос или предоставить полный код. –

+0

Да, это имеет смысл. Поскольку я разбираю pcap, у меня много пакетов с одной и той же bssid/essid-парой, и я хочу отфильтровать их, но я хочу увидеть тот же bssid с другим тезису (например, пустой темой в пакете) , –

ответ

1

Допустим, вы получите:

t[0] = 'foo' 
t[1] = 'bar' 

Затем мы попали код выше:

if not (t[0] in ssid_pairs and ssid_pairs[t[0]] == t[1]): 
    ssid_pairs[t[0]] = t[1] 
    of.write(t[0] + ',' + t[1] + ((',' + f + '\n') if verbose else '\n')) 

условие проходит (потому что t[0] не в ssid_pairs), поэтому мы устанавливаем:

ssid_pairs[t[0]] = t[1] 

Что дает нам:

ssid_pairs = { 
    'foo': 'bar', 
} 

В нашей следующей итерации цикла, мы читаем:

t[0] = 'foo' 
t[1] = 'gizmo' 

Ваше состояние проходит (потому ssid_pairs[t[0]] != t[1]), поэтому мы устанавливаем:

ssid_pairs[t[0]] = t[1] 

Который дает нам:

ssid_pairs = { 
    'foo': 'gizmo', 
} 

Затем мы читаем те же данные, с которыми мы столкнулись на нашей первой итерации:

t[0] = 'foo' 
t[1] = 'bar' 

Но так как мы просто ssid_pairs['foo'] = 'gizmo', ваше состояние будет проходить снова, и вы еще раз выписывать одни и те же данные.

Если вы пытаетесь получить список уникальных пар, то, возможно, создать набор (essid,bssid) кортежей:

seen_pairs = set() 
... 
if not ((t[0],t(1)) in seen_pairs): 
    seen_pairs.add((t[0], t[1])) 
    of.write(t[0] + ',' + t[1] + ((',' + f + '\n') if verbose else '\n')) 
1

Словари не может иметь дубликаты:

some_data = [('foo', 'bar'), 
      ('bang', 'quux'), 
      ('foo', 'bar'), 
      ('zappo', 'whoo'), 
      ] 

mydict = {} 
for data in some_data: 
    mydict[data[0]] = data[1] 

import pprint; print(mydict) 

Единственный способ вы собираетесь переписать те же данные, если вы Арен» t открыть файл в режиме 'w'. Но

with open('outfile.txt', 'w') as of: 
    for key in mydict: 
     of.write('{},{}{}'.format(key, mydict[key], (',' + f + '\n') if verbose else '\n')) 

Никогда не будет писать одну и ту же строку дважды.

Смежные вопросы