在 python 中使用 zip() 更新字典值
Updating dictionary values using zip() in python
我从 JSON 文件中提取了 4 个浮点数列表。我必须同时修改这 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"
}
]
}
]
}
我想知道如何更新字典本身的值。有没有办法在这里实现这个?
zip()
创建元组列表。这些元组不与原始列表共享任何内存,这意味着您无法使用 returns.
来改变 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
我从 JSON 文件中提取了 4 个浮点数列表。我必须同时修改这 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"
}
]
}
]
}
我想知道如何更新字典本身的值。有没有办法在这里实现这个?
zip()
创建元组列表。这些元组不与原始列表共享任何内存,这意味着您无法使用 returns.
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