2015-10-17 281 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]}