2017-07-03 21 views
2

我有一個在循環內創建的字典,我需要將這些字典同時追加到另一個字典。 它是否有任何優雅的方式來做到這一點?添加字典到詞典,使其看起來更多Python中的JSON

f_temp = df['Relevant findings'].values.tolist()[0:8] 
f_list = [x for i, x in enumerate(f_temp) if i == f_temp.index(x)] 
f_num_total = len(f_list) 
f_rand = random.randrange(1, f_num_total+1) 

def create_rep(arr, row_data, condname, modality): # get findings 
    params = [] 
    # to_json = [] 
    if condname == 'Mass' and modality == 'Mammography': 
     for i in range(len(arr)): 
      params += grab_data(row_data, 0, 14, 19) 
      row_data += 1 

for i in range(f_rand): 
      f = random.choice(f_list) 
      if f == 'Mass': 
       rep_temp = create_rep(iter_params_mass, row, f, r)   
     finding = {f: rep_temp} 
     #and now I have no idea where to go 

>>>{'Assymetry': {'Assymetry': ['Global asymmetry']}} 

我想通過一個在另一個字典追加的結果之一,以使它看起來像:

{'Findings/s': 
      {'Assymetry': 
       {'Assymetry': ['Global asymmetry']}}, 
      {'Mass': 
       {'Shape': ['Oval']}} 
     } 

任何想法,或者一個方法來創建嵌套的JSON對象?我遍歷了很多循環,所以我不確定什麼是最佳實踐。

+0

你想在'Finding'中擁有JSON數組嗎? – gorros

+0

顯示'create_rep'聲明和'f_list'的內容 – RomanPerekhrest

+0

@gorros是,然後將結果追加到「父」節點。我使用很多函數部分地獲取數據,然後我需要以某種方式將它們集合在一起。 –

回答

0

認爲您正在尋找這樣的事情:

finding = {} 
for i in range(f_rand): 
    f = random.choice(f_list) 
    rep_temp = None 
    if f == 'Mass': 
     rep_temp = create_rep(iter_params_mass, row, f, r)   
    finding[f] = rep_temp 

但我也想你想的if語句中的最後一行?不知道其餘的循環如何看。

4

你似乎在想這個。

Findings/s的值應該是一個列表,那麼可以將每個生成的字典追加到它。我使用的是defaultdict,所以第一次迭代不需要檢查d['Finding']是否已經存在。

from collections import defaultdict 

d = defaultdict(list) 
for i in range(f_rand): 
    f = random.choice(f_list) 
    if f == 'Mass': 
     rep_temp = create_rep(iter_params_mass, row, f, r)   
    d['Findings/s'].append({f: rep_temp}) 

注意:如果f不是'Mass'你會得到一個NameError因爲rep_temp不會被定義,你需要解決這個問題。

此外,您將create_rep的返回值重新指定爲rep_temp,但create_rep不返回任何內容。所以,除非這不是完整的代碼,否則會有一些意想不到的結果。

+0

如果我理解正確,defaultdict可能具有創建擴展對象所需的多個值,因爲它是一個列表,是正確的嗎?所以,如果它持有['發現','條件'],我可以使用每個值附加剛創建的字典? –

+0

@AliceJarmusch不是。正如我已經鏈接到的文檔中所解釋的那樣,'defaultdict'只是創建一個默認值而不是提高'KeyError' – DeepSpace

+0

看起來不錯,只需爲'rep_temp'添加一些默認值:) – gorros