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'))
下午好,
我正在阅读 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'))