更新嵌套字典中子键的值会覆盖旧值

时间:2020-02-07 13:16:36

标签: python dictionary jupyter-lab

我目前在嵌套词典中遇到问题,我无法终生诊断正在发生的事情。

所以...我从一个嵌套的字典开始,像这样:

$group

我想做的是使用一个嵌套的for循环进行迭代,并更新Loop1,Loop2,Loop3等中的每个键。

每个列表项都应基于以下函数进行更新:该函数基于存储在如下所示数据框中的tag_id从数据库中提取数据:

ctrl_data = 
{'Loop1': {'time_stamp': [],
      'pv': [],
      'sp': [],
      'op': [],
      'string_mode': [],
      'auto_mode': [],
      'cascade_mode': [],
      'operational': [],
      'operational_min': [],
      'operational_max': []},
     'Loop2': {'time_stamp': [],
      'pv': [],
      'sp': [],
      'op': [],
      'string_mode': [],
      'auto_mode': [],
      'cascade_mode': [],
      'operational': [],
      'operational_min': [],
      'operational_max': []},
     'Loop3': {time_stamp': [],
    ......etc.

我正在使用的循环如下:

               Loop1   Loop2   Loop3.......
id_type                                                     
pv               1       9      17  
sp               2      10      18  
op               3      11      19  
string_mode     NaN     NaN     NaN 
auto_mode        4      12      20  
cascade_mode     5      13      21  
operational      6      14      22  
operational_min  7      15      23  
operational_max  8      16      24

就好像拉回正确的tagid和列名而言,循环似乎正在正确运行,但是由于某种原因,当拉取数据时,每次重新进入第一个for循环时,它将覆盖前一个for循环。请查看此行为的截图。 Data Overwrites previous data for pv each time through the loop Result dict only contains data from last time the sub key was pulled

1 个答案:

答案 0 :(得分:1)

我现在找到了解决方案。正如@ Ch3steR所指出的,我的字典是任意嵌套的。我不完全理解这种含义,但是我想的是,当我写这篇文章时,它是这样的:

ctrl_data[i][order[0]] = values_pull_process(j[1],start1,end1,num_points,token,base_uri)[1]

它正在用新数据覆盖每个pv,sp,op等键的数据。我不确定为什么会这样,因为ctrl_data [i]应该调用主键“ Loop1”,但是无论如何,在此站点的“添加或更新嵌套字典项”部分下都找到了解决方案: https://www.learnbyexample.org/python-nested-dictionary/

解决方案是使用以下格式:

ctrl_data[i] = {order[0]: values_pull_process(j[1],start1,end1,num_points,token,base_uri)[1]}

注意: 使用.append或其他列表方法也导致相同的原始问题。