Python: 删除字典

Python: Dedup a dictionary

下午好,

我正在阅读 pcap,基本上是在尝试获取 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 是一个字典,t[0] 是 bssid & t[1] 是 essid。字典的一个例子是:

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

我仍然看到同一键-> 值对的多个实例被写入文件。我放入了一些调试打印语句,有时它会识别重复项,有时不会。这是来自带有 scapy 的解析 pcap。

感谢您的帮助。

*** 编辑:谢谢大家,我并没有真正用字典正确地解决我的问题。是时候更清楚地思考这个问题了...

词典不能有重复:

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)

要重写相同数据的唯一方法是不在 'w' 模式下打开文件。但是

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

永远不会把同一行写两次。

假设您得到:

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