2017-06-29 54 views
1

我有這樣的輸入作爲一個配置文件複製相同的數據和在密鑰創建嵌套字典,按照不同的值

a = 1 
b = 2 
c = 3 
dat = 4,5 

我試圖創建嵌套字典(D1 {})在格式從上面輸入如下:

{ 
    "0": { 
     "a ": "1", 
     "b ": "2", 
     "c": "3", 
     "dat": "4" 
    }, 
    "1": { 
     "a ": "1", 
     "b ": "2", 
     "c": "3", 
     "dat": "5" 
    } 
} 

下面是Python代碼我使用,

import json 
data_file = "Dataset" # as above input data from a file 
d = {} 
d1 = {} 
with open(data_file) as f: 
    for line in f: 
     (key, val) = line.strip().split('=') 
     d[key] = val 
    l1 = d['dat'] 
    z = l1.strip(' ').split(',') 
d.pop('dat') 

d1['0'] = d 
d1['1'] = d 

d1['0']['dat']= z[0] 
d1['1']['dat']= z[1] 
print d1 

這是輸出/結果我和下面的,而不是什麼,我上面

{ 
    "0": { 
     "a ": "1", 
     "b ": "2", 
     "c": "3", 
     "dat": "5" 
    }, 
    "1": { 
     "a ": "1", 
     "b ": "2", 
     "c": "3", 
     "dat": "5" 
    } 
} 

期待給出正如你可以在上面看到我不能存儲不同的值「得到數據集'的'dat'鍵0 &嵌套字典的1,並且即使在分配不同的列表索引z [0] & z [1]之後,它似乎也是相同的。 有人可以讓我知道我在上面的代碼中做了什麼錯誤,所以這兩個數據集中的值更新是不同的。

+0

在線D1'[ '0'] = d 和d1 [ '1'] = D' 您是從字面上保存在兩個相同的值。 –

+0

@code_byter:是的,這就是我想用相同的數據集創建嵌套字典,請參閱上面我的預期輸出。也讓我知道是否有更好的方法來做到這一點! –

+0

@shivrk你不明白@ code_byter的回答。如果您更改了'd1 ['0'] ['dat',那麼'd1 ['0']'和'd1 ['1']'不是**完全相同**字典, ]'就像你改變'd1 ['1'] ['dat']'一樣。 –

回答

1

問題是,python從不隱式地製作對象的副本。 當你

d1['0'] = d 
d1['1'] = d 

D1 [0]和d1 '1']成爲d引用。
所以d,d1 ['0']和d1 ['1']指的是相同的對象。
所以當你改變d時,d1 ['0']和d1 ['1']會改變。另外當你改變d1 ['0']和d1 ['1']中的任何一個時,另一個也被改變。

對於實際創建dictionries的副本,您可以使用copy()方法是這樣的:

d1['0'] = d.copy() 
d1['1'] = d.copy() 

,或者您可以使用字典()函數是這樣的:

d1['0'] = dict(d) 
d1['1'] = dict(d) 
+0

謝謝你!這解決了這個問題,也解釋和例子使它更清晰! –

+0

很高興能幫到你! –

0

解析文本文件到幾個json配置(具有隱式配置)。

file.txt的

a = 1 
b = 2 
c = 3 
dat = 4,5 

務必:

import json 

data_file = "file.txt" # as above input data from a file 
d = dict() 
n_configs = 0 
with open(data_file) as f: 
    for line in f: 
     key, values = [x.strip() for x in line.split('=')] 
     values = [x.strip() for x in values.split(',')] 
     if len(values) > n_configs: 
      n_configs = len(values) 
     d[key] = values 

configs = dict() 
for key, values in d.items(): 
    for n_config, value in enumerate(values): 
     if n_config not in configs: 
      configs[n_config] = dict() 
     configs[n_config][key] = value 
    n_config, value = len(values), values[-1] 
    for n_missing_config in range(n_config, n_configs): 
     if n_missing_config not in configs: 
      configs[n_missing_config] = dict() 
     configs[n_missing_config][key] = value 

print(json.dumps(configs, indent=4)) 

輸出:

{ 
    "0": { 
     "a": "1", 
     "c": "3", 
     "b": "2", 
     "dat": "4" 
    }, 
    "1": { 
     "a": "1", 
     "c": "3", 
     "b": "2", 
     "dat": "5" 
    } 
} 

該解決方案較爲一般,對於給定參數的最後的配置會下一個配置的配置(如果缺失)。參見:

文件。TXT

a = 1,4 
b = 2,3 
c = 3,6,7 
dat = 4 

輸出:

{ 
    "0": { 
     "a": "1", 
     "c": "3", 
     "b": "2", 
     "dat": "4" 
    }, 
    "1": { 
     "a": "4", 
     "c": "6", 
     "b": "3", 
     "dat": "4" 
    }, 
    "2": { 
     "a": "4", 
     "c": "7", 
     "b": "3", 
     "dat": "4" 
    } 
} 
相關問題