我有 4 個從 JSON 檔案中提取的浮點數串列。我必須同時修改這 4 個串列中的值,具體取決于第一個串列。我正在使用 zip() 遍歷所有 4 個串列,但我無法更新表示 JSON 的原始字典中的值。
我需要檢查第一個串列中元素的符號,如果它是負數,則必須將 4 個串列中與該元素具有相同索引的所有值清零。以下代碼片段包含一些示例資料:
{
"channels": [
{
"name": "TTZAR1e",
"samples": [
{
"data": [0.0996781, 0.0177724, -0.00566106],
"modifiers": [
{"data": [0.084338, 0.0103356, 0.010294], "type": "staterror"},
{"data": {"hi_data": [0.0996781, 0.0177724, -0.00566106], "lo_data": [0.0996781, 0.0177724, -0.00566106]}, "type": "histosys"}
],
"name": "conv"
}
]
}
]
}
這是我迄今為止嘗試過的:
import json
file = open("test1.json", 'r')
json_data = json.load(file)
for key, value in json_data.items():
for i in value:
for samp in i.get('samples'):
for mod in samp.get('modifiers'):
hi_list=[]
lo_list=[]
if(mod.get('type') == 'staterror'):
stat_list = mod.get('data')
if(mod.get('type') == 'histosys'):
hi_list = mod.get('data').get('hi_data')
lo_list = mod.get('data').get('lo_data')
for val, val2, val3, val4 in zip(samp.get('data'), hi_list, lo_list, stat_list):
if (val<0):
val,val2,val3,val4 = 0,0,0,0
當我列印 JSON 時,我仍然得到原始的負值。我正在努力的最終輸出類似于以下內容:
{
"channels": [
{
"name": "TTZAR1e",
"samples": [
{
"data": [0.0996781, 0.0177724, 0],
"modifiers": [
{"data": [0.084338, 0.0103356, 0],"type": "staterror"},
{"data": {"hi_data": [0.0996781, 0.0177724, 0], "lo_data": [0.0996781, 0.0177724, 0]}, "type": "histosys"}
],
"name": "conv"
}
]
}
]
}
我想知道如何更新字典本身的值。有沒有辦法在這里實作?
uj5u.com熱心網友回復:
zip()創建一個元組串列。這些元組不與原始串列共享任何記憶體,這意味著您無法將輸入更改為zip()使用它回傳的內容。
您應該存盤對要修改的串列的參考,然后就地修改它們。(我會注意到您應該認真考慮簡化此代碼,因為高嵌套深度使此代碼難以閱讀和除錯。)這是執行此操作的代碼片段:
for key, value in json_data.items():
for i in value:
for samp in i.get('samples'):
lists_to_modify = [samp.get('data')]
for mod in samp.get('modifiers'):
if(mod.get('type') == 'staterror'):
lists_to_modify.append(mod.get('data'))
if(mod.get('type') == 'histosys'):
lists_to_modify.append(mod.get('data').get('hi_data'))
lists_to_modify.append(mod.get('data').get('lo_data'))
for data_index in range(len(samp.get('data'))):
if samp.get('data')[data_index] < 0:
for list_to_modify in lists_to_modify:
list_to_modify[data_index] = 0
uj5u.com熱心網友回復:
更新串列的內部 for 回圈位于獲取串列的回圈內。你需要把它拿出來。那么由于您只需要 中負數的索引,所以samp.get('data')您不需要使用zip,而是需要enumerate. 然后它將按預期作業:
for key, value in json_data.items():
for i in value:
for samp in i.get('samples'):
for mod in samp.get('modifiers'):
if(mod.get('type') == 'staterror'):
stat_list = mod.get('data')
if(mod.get('type') == 'histosys'):
hi_list = mod.get('data').get('hi_data')
lo_list = mod.get('data').get('lo_data')
for i, val in enumerate(samp.get('data')):
if (val<0):
samp.get('data')[i] = hi_list[i] = lo_list[i] = stat_list[i] = 0
輸出:
{'channels': [{'name': 'TTZAR1e',
'samples': [{'data': [0.0996781, 0.0177724, 0],
'modifiers': [{'data': [0.084338, 0.0103356, 0], 'type': 'staterror'},
{'data': {'hi_data': [0.0996781, 0.0177724, 0],
'lo_data': [0.0996781, 0.0177724, 0]},
'type': 'histosys'}],
'name': 'conv'}]}]}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/403366.html
標籤:
上一篇:將嵌套的Json字串轉換為SparkDataframe
下一篇:動態TypeScript鍵名
