Skip to content Skip to sidebar Skip to footer

Dynamic Dict Value Access With Dot Separated String

I'm using Python 3.5.1 So what I am trying to do is pass in a dict a dot separated string representing the path to a key and a default value. I want to check for the keys existenc

Solution 1:

You could use recursivity:

def replace_key(the_dict, dict_keys, default_value):
    if dict_keys[0] in the_dict:
        if len(dict_keys)==1:
            the_dict[dict_keys[0]]=default_value
        else:
            replace_key(the_dict[dict_keys[0]], dict_keys[1:],default_value)
    else:
        raise Exception("wrong key")


some_dict = {'top_property': {'first_nested': {'second_nested': 'the value'}}}
key_to_replace = 'top_property.first_nested.second_nested'
default_value = 'replaced'
#this would returnas {'top_property': {'first_nested': {'second_nested': 'replaced'}}}
replace_key(some_dict, key_to_replace.split("."), default_value)

But it still uses the split(). But maybe you consider it to be less messy?

Solution 2:

the easyest way that I've found to do this, namely get value using a "key path" by "dotted string" is using replace and eval:

for key in pfields:
    if key.find('.') > 0:
        key = key.replace(".", "']['")
    try:
        data = str(eval(f"row['{key}']"))
    except KeyError:
        data = ''

And this is an example of the keys:

lfields = ['cpeid','metadata.LinkAccount','metadata.DeviceType','metadata.SoftwareVersion','mode_props.vfo.CR07.VIKPresence','mode_props.vfo.CR13.VIBHardVersion']

With this raw solution You don't need install other library

Post a Comment for "Dynamic Dict Value Access With Dot Separated String"