[英]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'}]}]
您真正需要的只是數據上的兩個循環和更新上的一個循環(無嵌套循環)。 這個想法是創建一個dict
或records
,將substepnumber
映射到substepparams
。 (請注意,這假定不重復子substepparams
。這種情況可以通過一些額外的工作來處理。)
對於每次更新,您都可以按O(1)攤銷時間訪問各自的子substepnumber
,並更新關聯的子substepparams
列表中的每個字典。
由於records
和data
引用相同的字典,因此原始數據將自動更新。
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.