skip to Main Content

I have a dictionary and would like to keep None values but remove values with "" and also values of any combination of " "’s

I have the following dictionary:

{'UserName': '',
 'Location': [{'City': '',
   'Country': 'Japan',
   'Address 1': '    ',
   'Address 2': ' '}],
 'PhoneNumber': [{'Number': '123-456-7890', 'ContactTimes': '', 'PreferredLanguage': None}],
 'EmailAddress': [{'Email': '[email protected]', 'Subscribed': None}],
 'FriendCount': [{'SumAsString': 'xndiofa!#$*9'}]
}

Expected result:

{
 'Location': [{
   'Country': 'Japan',
}],
 'PhoneNumber': [{'Number': '123-456-7890', 'PreferredLanguage': None}],
 'EmailAddress': [{'Email': '[email protected]', 'Subscribed': None}],
 'FriendCount': [{'SumAsString': 'xndiofa!#$*9'}]
}

I have this function and its partially working but I cant figure out how to remove key’s with the extra spaces.

def delete_junk(_dict):

    for key, value in list(_dict.items()):
        if isinstance(value, dict):
            delete_junk(value)
        elif value == '':
            del _dict[key]
        elif isinstance(value, list):
            for v_i in value:
                if isinstance(v_i, dict):
                    delete_junk(v_i)

    return _dict

2

Answers


  1. Your approach was sound; I also think defining a function using recursion is how I would approach the problem. I would use .isspace() to help.

    def delete_junk(d):
        """
        Recursively removes empty strings or strings consisting only of whitespaces
        from the input dictionary and its nested dictionaries and lists.
        """
        if isinstance(d, dict):
            return {k: remove_empty_strings(v) for k, v in d.items() if v != "" and not str(v).isspace()}
        elif isinstance(d, list):
            return [remove_empty_strings(v) for v in d if v != "" and not str(v).isspace()]
        else:
            return d
    
    
    i = {'UserName': '',
     'Location': [{'City': '',
       'Country': 'Japan',
       'Address 1': '    ',
       'Address 2': ' '}],
     'PhoneNumber': [{'Number': '123-456-7890', 'ContactTimes': '', 'PreferredLanguage': None}],
     'EmailAddress': [{'Email': '[email protected]', 'Subscribed': None}],
     'FriendCount': [{'SumAsString': 'xndiofa!#$*9'}]
    }
    
    output_dict = delete_junk(i)
    
    print(output_dict)
    # Output: {'Location': [{'Country': 'Japan'}],
    #          'PhoneNumber': [{'Number': '123-456-7890', 'PreferredLanguage': None}],
    #          'EmailAddress': [{'Email': '[email protected]', 'Subscribed': None}],
    #          'FriendCount': [{'SumAsString': 'xndiofa!#$*9'}]}
    
    Login or Signup to reply.
  2. With single dict comprehension implying recursive calls:

    def delete_junk(d):
        return {k: [delete_junk(i) for i in v] if isinstance(v, list) else v
                for k, v in d.items() 
                if not isinstance(v, str) or v.strip()}
    
    print(delete_junk(dct))
    

    {'EmailAddress': [{'Email': '[email protected]', 'Subscribed': None}],
     'FriendCount': [{'SumAsString': 'xndiofa!#$*9'}],
     'Location': [{'Country': 'Japan'}],
     'PhoneNumber': [{'Number': '123-456-7890', 'PreferredLanguage': None}]}
    
    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search