簡體   English   中英

如何使用collections.defaultdict以確保在Python中直接比較值

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM