4

Is there a way to get all nested field names of Python dictionary?

For example:

Dictionary:

{
   "a": [
      {
         "b": {
            "c": [
               "f",
               "g"
            ]
         }
      }
   ]
}

Result:

'a[0].b.c[0]'
'a[0].b.c[1]'
glibdud
  • 7,550
  • 4
  • 27
  • 37
Anatoli
  • 889
  • 2
  • 15
  • 33

1 Answers1

3

You can use recursion with a generator:

def traverse(d, c = []):
  if isinstance(d, list):
    for i, a in enumerate(d):
      if not isinstance(a, (dict, list)):
        yield '.'.join(c+[f'[{i}]'])
      else:
        yield from traverse(a, c+[f'[{i}]'])
  elif isinstance(d, dict):
     for a, b in d.items():
        if not isinstance(b, (list, dict)):
           yield '.'.join(c+[a])
        else:
           yield from traverse(b, c+[a])


d = {'a': [{'b': {'c': ['f', 'g']}}]}
import re
print([re.sub('\.(?=\[)', '', i) for i in traverse(d)])

Output:

['a[0].b.c[0]', 'a[0].b.c[1]']
Ajax1234
  • 69,937
  • 8
  • 61
  • 102