Home > Blockchain >  Access dictionary to X depth with a list of X values
Access dictionary to X depth with a list of X values

Time:09-29

Situation

I want to make a function that makes me free to give a full dictionary path parameter, and get back the value or node I need, without doing it node by node.

Code

This is the function. Obviously, as is now, it throws TypeError: unhashable type: 'list'. But it's only for getting the idea.

def get_section(api_data, section):
    if "/" in section:
        section = section.split("/")
        return api_data.json()[section]            
    return api_data.json()[section]

Example

JSON

{
  "component": {
    "name": "gino",
    "measures": [
      {
        "value": "12",
      },
      {
        "value": "14"
      }
    ]
  },
  "metrics": {
    ...
  }
}

Expectation

analyses = get_section(analyses_data, "component/measures") # Returns measures node

analyses = get_section(analyses_data, "component/name") # Returns 'gino'

analyses = get_section(analyses_data, "component/measures/value") # Returns error, because it's ambigous

Request

How can I do it?


Edits
  • Added examples for clarity

CodePudding user response:

A cool solution could be:

def get_section(api_data, section):
    return [api_data := api_data[sec] for sec in section.split("/")][-1]

So if you execute it with:

analyses_data = {
    "analyses": {
        "dates": {
            "xyz": "abc"
        }
    }
}
print(get_section(analyses_data, "analyses/dates/xyz")) # Returns: abc

Or since you are accessing a json using a custom method:

print(get_section(analyses_data.json(), "analyses/dates/xyz")) # Returns: abc

This works because the := operator in python is a variable assignment that returns the assigned value, so it loops all the parts of the section string by reassigning the api_data variable to the result of accessing that key and storing the result of every assignment in a list. Then with the [-1] at the end it returns the last assignment that corresponds to the last accessed key (a.k.a the last accessed dictionary level).

  • Related