2015-11-18 69 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']只設置新的價值都知道,你需要做的,正如其他人說什麼,是將該值作爲列表,然後將新值附加到該列表中