使用python中的引用dict更新第二级dict数组对象

2024-09-30 12:13:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个dict数组,如果每个dict中有另一个dict数组的话。我原来的字典是这样写的

[{'substepheading': 'Heading 1',
  'substepnumber': '1',
  'substepparams': [{'name': 'upload file', 'paramselected': 'no'}]},
 {'substepheading': 'Heading 2',
  'substepnumber': '2',
  'substepparams': [{'name': 'clean data', 'paramselected': 'no'}]}]

我有另一个dict,它包含对指定步骤号和参数的更新

[{'substepnumber': 2, 'substepparams': [{'name': 'clean room'}]}]

我试过了,但子阵列没有得到正确的更新

    for substep in substepdetails:
        for modifiedsubstep in substepdetailstoupdate:
            if((modifiedsubstep['substepnumber']) == int(substep['substepnumber'])):
                substep.update(modifiedsubstep)

dict的第二级数组被这样覆盖

[{'substepheading': 'choose file',
  'substepnumber': '1',
  'substepparams': [{'name': 'upload file', 'paramselected': 'no'}]},
 {'substepheading': 'prepare the data',
  'substepnumber': '2',
  'substepparams': [{'name': 'clean room'}]}]

我知道我可以为这个特殊的情况再添加一个内部循环,但是我想知道在这种情况下是否有更优雅的方法来更新dict,特别是如果可以有多个子级别这样的话

编辑:所需的输出如下

[{'substepheading': 'choose file',
      'substepnumber': '1',
      'substepparams': [{'name': 'upload file', 'paramselected': 'no'}]},
     {'substepheading': 'prepare the data',
      'substepnumber': '2',
      'substepparams': [{'name': 'clean room', 'paramselected': 'no'}]}]

Tags: nonamecleandata数组dictfileroom
1条回答
网友
1楼 · 发布于 2024-09-30 12:13:37

您真正需要的是在数据上有两个循环,在更新上有一个循环(没有嵌套循环)。其思想是创建一个dictrecords,将substepnumber映射到substepparams(注意,这假设substepparams没有重复。这个案子可以通过一些额外的工作来处理。)

对于每个更新,您可以在摊销O(1)时间内访问相应的substepnumber,并更新相关substepparams列表中的每个dict

因为recordsdata引用相同的dict,您的原始数据将自动更新

data = [
    {
        "substepheading": "Heading 1",
        "substepnumber": "1",
        "substepparams": [{"name": "upload file", "paramselected": "no"}],
    },
    {
        "substepheading": "Heading 2",
        "substepnumber": "2",
        "substepparams": [{"name": "clean data", "paramselected": "no"}],
    },
]

# converted substepnumber to str in order to match the data format.
updates = [{"substepnumber": "2", "substepparams": [{"name": "clean room"}]}]

records = {d["substepnumber"]: d["substepparams"] for d in data}
for num, params in ((d["substepnumber"], d["substepparams"]) for d in updates):
    [dct.update(upd) for dct in records[num] for upd in params]


[
    {
        "substepheading": "Heading 1",
        "substepnumber": "1",
        "substepparams": [{"name": "upload file", "paramselected": "no"}],
    },
    {
        "substepheading": "Heading 2",
        "substepnumber": "2",
        "substepparams": [{"name": "clean room", "paramselected": "no"}],
    },
]

相关问题 更多 >

    热门问题