[英]How to use collections.defaultdict, to ensure a straightforward comparison of values in Python
基本上,這是對我在堆棧溢出中看到的上一個問題的代碼修改,我發現進行端口掃描處理很有趣。 在這段代碼中,我試圖比較2個腌制文件,這些文件包含一個接一個執行的2個掃描的掃描結果。 我有興趣尋找
端口組上的3個操作
& (intersection): to see which ports have remained constant across scans (same ports) old - new: to see which ports were in the old scan but no longer in the new (deleted ports) new - old: to see which ports are in the new scan but were not in the old (added ports)
def comp_ports(self,filename):
try:
f = open(filename)
self.prev_report = pickle.load(f) # NmapReport
for s in self.prev_report.hosts:
self.old_port_dict[s.address] = collections.defaultdict(set())
for x in s.get_open_ports():
self.old_port_dict[s.address].add(x)
for s in self.report.hosts:
self.new_port_dict[s.address] = collections.defaultdict(set())
for x in s.get_open_ports():
self.new_port_dict[s.address].add(x)
hosts = sorted(set(self.prev_report.hosts.keys() + self.report.hosts.keys()))
for host in hosts:
scan_same[host] = self.prev_report.hosts[host] & self.report.hosts[host]
scan_new[host] = self.report.hosts[host] - self.prev_report.hosts[host]
scan_del[host] = self.prev_report.hosts[host] - self.report.hosts[host]
print()
print('-' * 10, 'Same')
for host, ports in scan_same.items():
print(host, ':')
for port in ports:
print(':::', port[0], '/', port[1])
print()
print('*' * 10, 'Added')
for host, ports in scan_new.items():
print(host, ':')
for port in ports:
print(':::', port[0], '/', port[1])
print()
print('=' * 10, 'Deleted')
for host, ports in scan_del.items():
print(host, ':')
for port in ports:
print(':::', port[0], '/', port[1])
except Exception as l:
print l
但是代碼拋出:
first argument must be callable
幫助我有效地使用收藏集。
PS:嘗試通過這種方式進行改進如何比較字典,看看有什么變化?
您需要傳遞一個可調用的(函數/類/方法),該可調用的函數將返回默認值,而不是默認值本身。
遵循表達式:
collections.defaultdict(set())
應替換為:
collections.defaultdict(set)
UPDATE
您需要在for
循環之外創建defaultdict
:
self.old_port_dict = collections.defaultdict(set)
for s in self.prev_report.hosts:
for x in s.get_open_ports():
self.old_port_dict[s.address].add(x)
self.new_port_dict = collections.defaultdict(set)
for s in self.report.hosts:
for x in s.get_open_ports():
self.new_port_dict[s.address].add(x)
要回答標題中的問題,您需要做
collections.defaultdict(set)
您需要傳遞一些可以實例化的東西。 傳入collections.defaultdict(set())
傳入已實例化的東西。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.