2015-10-17 187 views
2
import re 


ports = {} 
file = open("Asn1_TCPdump_format3.txt") 



def makerPorts(src, port, ports): 
    if src in ports: 
     ports[src][0].append(port) 
    else: 
     ports[src] = [port] 

    return ports 



for k, v in ports.items(): 
    print(k, v) 

我在這裏要做的是做一個字典,其中的KEY是IP地址,值是每個IP地址試圖連接的端口列表至。我覺得這應該是非常簡單的,但是我很難把這個問題包括在內?Python 3追加到字典列表值

我的正則表達式都很好破碎的部分是makerPort函數,我想要一個IP,一個端口和一個字典的功能。它比檢查字典ip是否是一個關鍵字,並且它是否將端口添加到端口列表中。如果IP還不是密鑰,它會將IP作爲密鑰並將端口添加爲列表中的值。

+1

看來,從'else'聲明,就好像你的字典的形式d的= {IP1:[port11,port12],IP2: [port21,port22,port23]}。如果是這樣,你的'if'語句很奇怪,因爲你試圖對數字進行「追加」('port [src] [0]'是一個數字,而不是一個列表)。 – dorverbin

回答

1

您的代碼幾乎是正確的,您只需從ports[src][0]中刪除[0]。原因在於ports字典中的鍵值都是表示每個ip(字典的鍵)連接到的端口的整數列表。

因此,選擇一個像port["127.0.0.1"]這樣的特定值的端口會給你一個列表,如[80, 8080]。通過做port["127.0.0.1"][0]您正在選擇該列表的第一項,在這種情況下,80。因此,通過執行port["127.0.0.1"][0],您實際上正在調用80.append(),這會導致您的代碼失敗,因爲append()是一個列表方法。

工作版本將是這個樣子:

>>> ports = {} 
>>> def makerPorts(src, port, ports): 
... if src in ports: 
...  ports[src].append(port) 
... else: 
...  ports[src] = [port] 
... 
... return ports 
... 
>>> makerPorts("1.0.0.1",80,ports) 
>>> makerPorts("1.0.0.1",40,ports) 
>>> makerPorts("1.0.0.2",40,ports) 
>>> makerPorts("1.0.0.3",80,ports) 
>>> makerPorts("1.0.0.3",40,ports) 
>>> print(ports) 
{'1.0.0.2': [40], '1.0.0.1': [80, 40], '1.0.0.3': [80, 40]}