Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ## get a nested value from a dictionary with only the final key ######################
- ## a version for key/s AND indices [but no dType] at https://pastebin.com/G92TZnnK ###
- ### example of usage in Example 1 at https://pastebin.com/5AjaUne0 ###################
- ## [ specifying data type of value with dType is optional ]
- # a generator for the values
- def yield_by_nested_keys(obj:dict, *keys, dType=None):
- if not keys or not isinstance(obj,(dict,list,set,tuple)): return
- if not isinstance(obj, dict):
- for v in obj:
- for y in yield_by_nested_keys(v,*keys,dType=dType): yield y
- return
- if len(keys)==1 and keys[0] in obj:
- if dType is None or isinstance(obj[keys[0]], dType):
- yield_list = obj[keys[0]] if dType==list else [obj[keys[0]]]
- for y in yield_list: yield y
- for k, v in obj.items():
- next_keys = keys[1:] if k==keys[0] else keys
- for y in yield_by_nested_keys(v,*next_keys,dType=dType): yield y
- # returns either a list [if returnAll is True] or a single value [or vDef]
- '''NOTE: if dType is list and find_all is not set [i.e., not True], then
- only the 1st item will be returned [or vDef if list is empty]'''
- def get_by_nested_keys(obj:dict,*keys,dType=None,find_all=False,vDef=None):
- v_generator = yield_by_nested_keys(obj, *keys, dType=dType)
- if find_all: return list(v_generator)
- for v in v_generator: return v
- return vDef
Advertisement
Add Comment
Please, Sign In to add comment