簡體   English   中英

使用python中的引用字典更新第二級字典數組對象

[英]update second level dict array object using a reference dict in python

我有一組字典,如果有另一組字典,則在每個字典中。 我的原始字典是這樣的

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

我還有另一個字典,其中包含對指定步驟編號和參數的更新,如下所示

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

我嘗試了這個,但是子數組沒有正確更新

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

字典的第二層數組像這樣被覆蓋

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

我知道我可以為這種特殊情況添加一個內部循環,但是我想知道在這種情況下是否有更優雅的方法來更新字典,尤其是如果可以有多個子級別,例如

編輯:所需的輸出是這樣的

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

您真正需要的只是數據上的兩個循環和更新上的一個循環(無嵌套循環)。 這個想法是創建一個dictrecords ,將substepnumber映射到substepparams (請注意,這假定不重復子substepparams 。這種情況可以通過一些額外的工作來處理。)

對於每次更新,您都可以按O(1)攤銷時間訪問各自的子substepnumber ,並更新關聯的子substepparams列表中的每個字典。

由於recordsdata引用相同的字典,因此原始數據將自動更新。

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"}],
    },
]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM