Try95th

get_by_nested_keys

Mar 19th, 2023 (edited)
127
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 1.43 KB | None | 0 0
  1. ## get a nested value from a dictionary with only the final key ######################
  2. ## a version for key/s AND indices [but no dType] at https://pastebin.com/G92TZnnK ###
  3. ### example of usage in Example 1 at https://pastebin.com/5AjaUne0 ###################
  4.  
  5. ## [ specifying data type of value with dType is optional ]
  6. # a generator for the values
  7. def yield_by_nested_keys(obj:dict, *keys, dType=None):
  8.     if not keys or not isinstance(obj,(dict,list,set,tuple)): return
  9.     if not isinstance(obj, dict):
  10.         for v in obj:
  11.             for y in yield_by_nested_keys(v,*keys,dType=dType): yield y
  12.         return
  13.     if len(keys)==1 and keys[0] in obj:
  14.         if dType is None or isinstance(obj[keys[0]], dType):
  15.             yield_list = obj[keys[0]] if dType==list else [obj[keys[0]]]
  16.             for y in yield_list: yield y
  17.     for k, v in obj.items():
  18.         next_keys = keys[1:] if k==keys[0] else keys
  19.         for y in yield_by_nested_keys(v,*next_keys,dType=dType): yield y
  20.  
  21. # returns either a list [if returnAll is True] or a single value [or vDef]
  22. '''NOTE: if dType is list and find_all is not set [i.e., not True], then
  23.   only the 1st item will be returned [or vDef if list is empty]'''
  24. def get_by_nested_keys(obj:dict,*keys,dType=None,find_all=False,vDef=None):
  25.     v_generator = yield_by_nested_keys(obj, *keys, dType=dType)
  26.     if find_all: return list(v_generator)
  27.     for v in v_generator: return v
  28.     return vDef
Advertisement
Add Comment
Please, Sign In to add comment