在 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