【问题标题】:Updating dictionary values using zip() in python在 python 中使用 zip() 更新字典值
【发布时间】:2022-01-03 06:46:16
【问题描述】:

我有 4 个从 JSON 文件中提取的浮点数列表。我必须同时修改这 4 个列表中的值,具体取决于第一个列表。我正在使用 zip() 遍历所有 4 个列表,但我无法更新表示 JSON 的原始字典中的值

我需要检查第一个列表中元素的符号,如果它是负数,则必须将 4 个列表中与该元素具有相同索引的所有值清零。以下代码 sn -p 包含一些示例数据:

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

我想知道如何更新字典本身的值。有没有办法在这里实现?

【问题讨论】:

  • 我认为你的循环是最好的方法。
  • 感谢@U12-Forward :) 我无法将更改传播到 dict 值...我确定我在这里遗漏了一些重要步骤。

标签: python json dictionary zip nested-lists


【解决方案1】:

zip() 创建一个元组列表。这些元组不与原始列表共享任何内存,这意味着您无法使用它返回的内容将输入更改为 zip()

您应该存储对要修改的列表的引用,然后就地修改它们。 (我会注意,您应该认真考虑简化此代码,因为高嵌套深度使此代码难以阅读和调试。)这是一个代码 sn-p:

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

【讨论】:

  • 非常感谢@BrokenBenchmark 的解释,它有效:))通过简化,您指的是多个“for”循环吗?
  • 是的。 JSON 数据本身包含大量嵌套,因此我可以理解为什么这些循环看起来很有必要,但您将需要同时跟踪许多不同的变量。例如,我必须在底部的for 循环中使用data_index 而不是i,因为i 用于外部循环。使用描述性名称以及减少嵌套有助于提高可读性,并使您和其他人更容易识别代码可能出现的任何问题。
  • 是的,确实json本身有很多嵌套,无法更改,导致这些for循环。我将确保将描述添加到嵌套循环中以使其更具可读性,再次感谢您的解决方案和提示!
  • @Manlai 和@BrokenBenchmark 我有一个关于更新 json 文件的快速跟进问题。我正在尝试执行以下操作以生成具有上述更改的新 json 文件 - with open("test1.json", 'r') as file: json_data = json.load(file) (the above modifications) with open("new.json",'w') as file1: file1.write(json.dumps(json_data,indent=3)) 但在我的新 json 文件中,值在新行中垂直打印,而不是原始 json 中的格式。有没有办法可以解决这个问题?谢谢!
猜你喜欢
  • 2017-07-18
  • 1970-01-01
  • 1970-01-01
  • 2018-02-11
  • 2022-07-24
  • 2020-07-22
  • 1970-01-01
  • 1970-01-01
  • 2012-04-11
相关资源
最近更新 更多