2017-07-03 50 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