根据字典中已提供的映射,从另一个嵌套字典中更新嵌套字典值

时间:2019-06-26 09:15:37

标签: python dictionary

我需要写下一种方法来从另一个嵌套字典中转换现有的嵌套字典值,但是这两个字典之间的映射位于另一个第三个字典中。

input_json = { 
              "s0" : 
              {
                 "s1"  :  {
                       "s1_f1":"s1_v1",
                       "s1_f2" : "s1_v2"
                     },
                  "s2":   {
                       "s2_f1":"s2_v1",
                       "s2_f2" : "s2_v2",
                       "s2_f3" : {
                                    "s3_f1":"s3_v1"
                                 }
                     }
              }
}

swagger_template = { "d0" : 
                     {
                       "d1_f1":"d1_v1",
                       "d3_f1" :"d3_v1"
                     }
            }

mapping = {
            "d1_f1":"s1_f1",
            "d3_f1" : "s3_f1"
          }

def find_mapping_key(v):  
      return (mapping[v])


def find_input_value(k,input_json):  
  if k in input_json:
        return input_json[k]
  for v in input_json.values():
        if isinstance(v, dict):
            return find_input_value(k,v)
  return None



def transform(swagger_template):  
  for k, v in swagger_template.items():   
    if isinstance(v, dict):
      transform(v)      
    else:
         print("{0} : {1}".format(k, v))
         #find the mapping value for this key in mapping JSON 
         print(find_mapping_key(k))
         mapping_key=find_mapping_key(k)
         #find the value for that mapping key in input_json 
         print(find_input_value(mapping_key,input_json))




transform(swagger_template)

为一个映射提供正确的值,但为另一个映射返回NONE。

enter image description here

1 个答案:

答案 0 :(得分:1)

在函数find_input_value中,您没有通过递归正确传播输出。递归函数需要具有一致的返回值。您有2个returns发送结果,有1个发送None。这是一个对我有用的版本,即使我怀疑它可以简化。

def find_input_value(k,input_json):  
  if k in input_json:
    val = input_json[k]
  for v in input_json.values():
    if 'val' in locals(): #check if val has been defined
      if val is not None: #needs to be defined and not None
        break             # kill the loop cause found it
    if isinstance(v, dict):
      val = find_input_value(k,v)
  return val if 'val' in locals() else None # if input_json is not dict return None

输出

d1_f1:d1_v1

s1_f1

s1_v1

d3_f1:d3_v1

s3_f1

s3_v1