2015-11-18 66 views
2

我正在寻找想法,指针,以帮助我得出一个解决方案,以防止以前的值被覆盖。我已经看到了一些列表的实现,但想看看,如果有更好的方法在那里Python字典:防止以前的值不被新值覆盖

场景: 我想读一个Wireshark解码文件并将其放入一个Python字典。我编写了代码,并开始将数据放入字典中,从DNS数据开始,这些数据已包含在问题中。 代码读入第一个DNS主机的数据并填充字典。现在说到第二个Host_Id,“1”,它会覆盖DNS数据值,包括Host_Id字段。

代码的片段是

dictionarynetworkobject = {} 
dictionarynetworkobject['DNS']['HostId'] = 0 

然而,

dictionarynetworkobject['DNS']['HostId'] = 1 

重写,用于HOSTID = 0同样的事情数据是发生于,TCP_Seq_ID和HTTP数据。 但是,我看了很多,没有找到更好的方法来添加“Host_Id”,“TCP_Seq_ID”和“HTTP_Transaction_id”的不同值,以写入第一个值之后。

我看了更新,方法,但它不会工作。另外,我试过

from collections import defaultdict 
def tree(): return defaultdict(tree) 
dictionarynetworkobject = tree() 

但是这也行不通。我想在这件事上挑选团队的大脑。下面是结构,我想实现。

networList = { 
      'DNS': 
        { 
       'Host_Id' : 
          { 
    { '0': {'Local_Time':2015-10-02 17:20, 'DNS_Time': 2015-10-02 17:20, 'Num_Bytes':265, 'IP':1.2.3.4,'IPMODE':IPV4}}, 
    { '1': {<-OverWriting the Previous Data->}}, 
    { '2': {<-OverWriting the Previous Data->}}, 
    { '3': {<-OverWriting the Previous Data->}} 
            } 
        }     

      'TCP': {  
         'TCP_SEQ_NO': { 
             {'0': {TCP network data}}, 
             {'2': {TCP network data}}, 
             {'3': {TCP network data}}, 
             {'4': {TCP network data}} 
             } 
        }, 

      'HTTP': { 'HTTP_Transaction_id': { 
                {'0': {HTTP data}}, 
                {'1': {HTTP data}}, 
                {'2': {HTTP data}}, 
                {'3': {HTTP data}} 
               } 
        }   
      } 

________________________ Data for the DNS ____________________________________ 
Local_Time   Host_Id   DNS_Time  Num_Bytes  IP  IPMODE 
2015-10-02 17:20  0  2015-10-02 17:20 265   1.2.3.4 IPV4 
2015-10-02 17:20  1  2015-10-02 17:20 106   5.6.7.8 IPV4 
2015-10-02 17:20  2  2015-10-02 17:20 912   8.7.6.5 IPV4 
2015-10-02 17:20  3  2015-10-02 17:20 913   4.3.2.1 IPV4 
________________________________________________________________________________ 
+0

您想要一个collections.defaultdict,如果您有搜索,SO上有一百万个例子 –

回答

4

我认为你正在寻找一个这样的结构,也许?

dictionarynetworkobject['DNS']['HostId'] = {} 
dictionarynetworkobject['DNS']['HostId'][0] = {'Local_Time':2015-10-02 17:20, 'DNS_Time': 2015-10-02 17:20, 'Num_Bytes':265, 'IP':1.2.3.4,'IPMODE':'IPV4'} 
dictionarynetworkobject['DNS']['HostId'][1] = {...} 
dictionarynetworkobject['DNS']['HostId'][2] = {...} 
+0

谢谢,它可行,但是这个: dictionarynetworkobject ['DNS'] ['HostId'] [1] = {...}不断覆盖之前的值。我正在从文件中以序列方式读取值,从0,1,2,3开始。因此,我正在执行dictionarynetworkobject ['DNS'] ['HostId'] [HostIdVariable] = {...} – user3626173

+0

也许你在可变数据结构和不可变数据结构方面存在问题。注意事项如下: a = {'key':1}; b = a; b ['key'] = 100; a == {'key':100} https://en.wikibooks.org/wiki/Python_Programming/Data_Types#Mutable_vs_Immutable_Objects – mgcdanny

1

您需要listdict

dictionarynetworkobject['DNS']['HostId'] = [] 
dictionarynetworkobject['DNS']['HostId'].append(0) 

dictionarynetworkobject['DNS']['HostId'].append(1) 

print(dictionarynetworkobject['DNS']['HostId']) 
# [0, 1] 
0

至于用Python代码您现在的位置dictionarynetworkobject['DNS']['HostId']只设置新的价值都知道,你需要做的,正如其他人说什么,是将该值作为列表,然后将新值附加到该列表中