'Retrieving dictionary keys with pre-fixed parent keys using python

I am trying to list all keys with parent keys from a dictionary using python 3. How can I achieve this goal?

Here is so far I did using a recursive function (so that I can use this with any depth of dictionaries).

Here, if I do not use header_prefix, I get all the keys without parent keys. However, when I use header_prefix, it keeps adding parent keys incorrectly to the keys. Basically, I cannot reset header_prefix in the appropriate location.

from pprint import pprint
#%%

data = {
  "AWSTemplateFormatVersion": "2010-09-09" ,
  "Description": "Stack for MyProject 01",
  "Resources": {
    "elb01": {
      "Type": "AWS::ElasticLoadBalancing::LoadBalancer",
      "Properties": {
        "CrossZone" : "false",
        "HealthCheck" : {
          "Target" : "TCP:80",
          "Interval" : "20"
        },
        "ConnectionSettings": {
          "IdleTimeout": "120"
        }
      }
    },
    "lc01": {
      "Type": "AWS::AutoScaling::LaunchConfiguration" ,
      "Properties": {
        "ImageId" : "ami-01010105" ,
        "InstanceType" : "t2.medium" 
      }
    },
    "asg01": {
      "Type" : "AWS::AutoScaling::AutoScalingGroup",
      "Properties" : {
        "HealthCheckGracePeriod" : 300,
        "HealthCheckType" : "EC2"
      }
    }
  }
}
pprint(data)

#%%

def get_headers(json_data, headers, header_prefix):
    for key, value in json_data.items():
        if type(value) == dict:
            header_prefix = header_prefix + key + '.'
            get_headers(value,headers,header_prefix)
        else:
            headers.append(header_prefix+key)
    
    return(headers)
#%%
header_list = []
prefix = ''
data_headers = get_headers(data, header_list, prefix)

pprint(data_headers)

From the above code, I get the following output:

['AWSTemplateFormatVersion',
 'Description',
 'Resources.elb01.Type',
 'Resources.elb01.Properties.CrossZone',
 'Resources.elb01.Properties.HealthCheck.Target',
 'Resources.elb01.Properties.HealthCheck.Interval',
 'Resources.elb01.Properties.HealthCheck.ConnectionSettings.IdleTimeout',
 'Resources.elb01.lc01.Type',
 'Resources.elb01.lc01.Properties.ImageId',
 'Resources.elb01.lc01.Properties.InstanceType',
 'Resources.elb01.lc01.asg01.Type',
 'Resources.elb01.lc01.asg01.Properties.HealthCheckGracePeriod',
 'Resources.elb01.lc01.asg01.Properties.HealthCheckType']

My expected output is like below:

 ['AWSTemplateFormatVersion',
 'Description',
 'Resources.elb01.Type',
 'Resources.elb01.Properties.CrossZone',
 'Resources.elb01.Properties.HealthCheck.Target',
 'Resources.elb01.Properties.HealthCheck.Interval',
 'Resources.elb01.Properties.ConnectionSettings.IdleTimeout',
 'Resources.lc01.Type',
 'Resources.lc01.Properties.ImageId',
 'Resources.lc01.Properties.InstanceType',
 'Resources.asg01.Type',
 'Resources.asg01.Properties.HealthCheckGracePeriod',
 'Resources.asg01.Properties.HealthCheckType']


Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source