Python – yaml multi nested and python dictionary

pythonyaml

I am new to yaml the output is in the expected format but wondering if there is a better way to construct the below nested objects in yaml.

import yaml
yaml.load ("""
test1:
    a: 
      a1:
        a2:
          a3: 0
          b3: 0
          c3: 0
        b2:         
          a3: 0
          b3: 0
          c3: 0
        c2:
          a3: 0
          b3: 0
          c3: 0  
      b1:
        a2:
          a3: 0
          b3: 0
          c3: 0
        b2:         
          a3: 0
          b3: 0
          c3: 0
        c2:
          a3: 0
          b3: 0
          c3: 0 
      c1:
        a2:
          a3: 0
          b3: 0
          c3: 0
        b2:         
          a3: 0
          b3: 0
          c3: 0
        c2:
          a3: 0
          b3: 0
          c3: 0 
    b: 
      a1:
        a2:
          a3: 0
          b3: 0
          c3: 0
        b2:         
          a3: 0
          b3: 0
          c3: 0
        c2:
          a3: 0
          b3: 0
          c3: 0  
      b1:
        a2:
          a3: 0
          b3: 0
          c3: 0
        b2:         
          a3: 0
          b3: 0
          c3: 0
        c2:
          a3: 0
          b3: 0
          c3: 0 
      c1:
        a2:
          a3: 0
          b3: 0
          c3: 0
        b2:         
          a3: 0
          b3: 0
          c3: 0
        c2:
          a3: 0
          b3: 0
          c3: 0 
    c: 
      a1:
        a2:
          a3: 0
          b3: 0
          c3: 0
        b2:         
          a3: 0
          b3: 0
          c3: 0
        c2:
          a3: 0
          b3: 0
          c3: 0  
      b1:
        a2:
          a3: 0
          b3: 0
          c3: 0
        b2:         
          a3: 0
          b3: 0
          c3: 0
        c2:
          a3: 0
          b3: 0
          c3: 0 
      c1:
        a2:
          a3: 0
          b3: 0
          c3: 0
        b2:         
          a3: 0
          b3: 0
          c3: 0
        c2:
          a3: 0
          b3: 0
          c3: 0  

""")

output:

'test1': {'a': {'a1': {'c2': {'c3': 0, 'a3': 0, 'b3': 0}, 'a2': {'c3': 0, 'a3': 0, 'b3': 0}, 'b2': {'c3': 0, 'a3': 0, 'b3': 0}}, 'c1': {'c2': {'c3': 0, 'a3': 0, 'b3': 0}, 'a2': {'c3': 0, 'a3': 0, 'b3': 0}, 'b2': {'c3': 0, 'a3': 0, 'b3': 0}}, 'b1': {'c2': {'c3': 0, 'a3': 0, 'b3': 0}, 'a2': {'c3': 0, 'a3': 0, 'b3': 0}, 'b2': {'c3': 0, 'a3': 0, 'b3': 0}}}, 'c': {'a1': {'c2': {'c3': 0, 'a3': 0, 'b3': 0}, 'a2': {'c3': 0, 'a3': 0, 'b3': 0}, 'b2': {'c3': 0, 'a3': 0, 'b3': 0}}, 'c1': {'c2': {'c3': 0, 'a3': 0, 'b3': 0}, 'a2': {'c3': 0, 'a3': 0, 'b3': 0}, 'b2': {'c3': 0, 'a3': 0, 'b3': 0}}, 'b1': {'c2': {'c3': 0, 'a3': 0, 'b3': 0}, 'a2': {'c3': 0, 'a3': 0, 'b3': 0}, 'b2': {'c3': 0, 'a3': 0, 'b3': 0}}}, 'b': {'a1': {'c2': {'c3': 0, 'a3': 0, 'b3': 0}, 'a2': {'c3': 0, 'a3': 0, 'b3': 0}, 'b2': {'c3': 0, 'a3': 0, 'b3': 0}}, 'c1': {'c2': {'c3': 0, 'a3': 0, 'b3': 0}, 'a2': {'c3': 0, 'a3': 0, 'b3': 0}, 'b2': {'c3': 0, 'a3': 0, 'b3': 0}}, 'b1': {'c2': {'c3': 0, 'a3': 0, 'b3': 0}, 'a2': {'c3': 0, 'a3': 0, 'b3': 0}, 'b2': {'c3': 0, 'a3': 0, 'b3': 0}}}}} 

Best Answer

I can think of two ways that will save you some typing on the yaml front.

Use the short mapping syntax:

test1:
    a:
      a1:
        a2: {a3: 0, b3: 0, c3: 0}
        b2: {a3: 0, b3: 0, c3: 0}
        c2: {a3: 0, b3: 0, c3: 0}
      b1:
        a2: {a3: 0, b3: 0, c3: 0}
        b2: {a3: 0, b3: 0, c3: 0}
        c2: {a3: 0, b3: 0, c3: 0}
      c1:
        a2: {a3: 0, b3: 0}

Use aliases:

entry: &aliasentry
  a2: {a3: 0, b3: 0, c3: 0}
  b2: {a3: 0, b3: 0, c3: 0}
  c2: {a3: 0, b3: 0, c3: 0}

test1:
    a:
      a1: *aliasentry
      b1: *aliasentry
      c1: {a2: {a3: 0, b3: 0}}