o.o
o.o

Reputation: 3751

Remove keys but keep values from dictionary

Let's say I have this dictionary:

{
  "id": "132-sd-sa-23-a-1",
  "data": {
    "lastUpdated": { "S": "2020-07-22T21:39:20Z" },
    "profile": {
      "M": {
        "address": { "L": [] },
        "fakeField": { "S": "someValue" },
        "someKey": { "M": { "firstName": { "S": "Test" } } }
      }
    },
    "groups": {
      "L": [{ "S": "hello world!" }]
    }
  }
}

How can I remove the "M", "S", "L", etc. keys from the dictionary but keep the values. So it would turn into this:

{
  "id": "132-sd-sa-23-a-1",
  "data": {
    "lastUpdated": "2020-07-22T21:39:20Z",
    "profile": {
      "address": [],
      "fakeField": "someValue",
      "someKey": { "firstName": "Test" }
    },
    "groups": ["hello world!"]
  }
}

I could turn the dictionary into a string, loop through it, and remove what's necessary but that doesn't seem efficient or fast. I can't save the original list as the output that I'm hoping for initially so I need to convert it myself.

Upvotes: 0

Views: 92

Answers (1)

L3viathan
L3viathan

Reputation: 27273

Sounds like a job for recursion:

def unsml(obj):
    if isinstance(obj, dict):
        if len(obj) == 1:
            (key, value), *_ = obj.items()  # get the only key and value
            if key in "SML":
                return unsml(value)
        return {
            key: unsml(value) if isinstance(value, dict) else value
            for key, value
            in obj.items()
        }
    elif isinstance(obj, list):
        return [unsml(value) for value in obj]
    return obj

Then just do new_dict = unsml(old_dict).

Upvotes: 1

Related Questions