【问题标题】:Add dictionary to dictionary to make it look more JSON in Python将字典添加到字典以使其在 Python 中看起来更像 JSON
【发布时间】:2017-12-06 17:22:22
【问题描述】:

我有一个在循环中创建的字典,我需要同时将这些字典附加到另一个字典。 有什么优雅的方法吗?

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 对象的方法?我正在迭代很多循环,所以我不确定最佳做法是什么。

【问题讨论】:

  • 你想在Finding 中有 JSON 数组吗?
  • 显示create_rep声明和f_list内容
  • @gorros 是的,然后还将结果附加到“父”节点。我正在使用很多函数获取部分数据,然后我需要以某种方式将它们整合在一起。

标签: python json loops dictionary


【解决方案1】:

你好像想多了。

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 不返回任何内容。所以,除非这不是你的完整代码,否则你会得到一些意想不到的结果。

【讨论】:

  • 如果我理解正确,defaultdict 可能有创建扩展对象所需的多个值,因为它是一个列表,对吗?那么,如果它持有 ['Finding', 'Condition'] 我可以使用每个值来附加刚刚创建的字典?
  • @AliceJarmusch 不是。正如我链接到的文档中所解释的那样,defaultdict 只是创建一个默认值而不是提高 KeyError
  • 看起来不错,只需为 rep_temp 添加一些默认值即可:)
  • @gorros 我会把它留给 OP,但我编辑了答案:)
  • 谢谢,但这里又引发了另一个错误:defaultdict(, {'Findings/s': [{'Calcifications': {'Typically良性': ['Coarse or "popcorn -like”'], '可疑形态': ['Fine pleomorphic'], '分布': ['Diffuse']}}, {'Mass': {'Shape': ['Oval'], 'Margin': ['Indistinct'], 'Density': ['Equal density']}}]}) - 我只是想简单地打印结果,这并不是我真正想要的,但非常接近。如果我有 defaultdic 持有列表,最终,值会附加到列表中,我必须将它们附加到字典中。
【解决方案2】:

认为你正在寻找这样的东西:

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 语句中的最后一行?不确定其余循环的外观。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-21
    • 1970-01-01
    • 1970-01-01
    • 2023-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多