Try95th

getYield_NestedVal

Feb 3rd, 2023 (edited)
158
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 1.27 KB | None | 0 0
  1. ## get a nested value from a dictionary or [non-string] iterable with only the final key ##
  2. ### simplified version of https://pastebin.com/NRxKRJPn ###################################
  3. ### [ this version does not keep track of keys on the paths to the value/s ] ##############
  4. ### for values with specific data-type, use version at https://pastebin.com/LsZUiRW2 ######
  5. ### example of usage at https://stackoverflow.com/a/75338566/6146136 ######################
  6.  
  7. # a generator for the values
  8. def yieldNestedVals(obj, keysList):
  9.     if isinstance(obj, str) or not keysList: return
  10.     try:
  11.         nextVal, nextKeys = obj[keysList[0]], keysList[1:]
  12.         vList = yieldNestedVals(nextVal, nextKeys) if nextKeys else [nextVal]
  13.     except: vList = []
  14.     for v in vList: yield v
  15.     if isinstance(obj, dict): obj = obj.values()
  16.     for i in (obj if hasattr(obj, '__iter__') else []):
  17.         for v in yieldNestedVals(i, keysList): yield v
  18.  
  19. # returns either a list [if returnAll is True] or a single value [or `None`]
  20. def getNestedVal(fObj, gKey, returnAll=False):
  21.     gKey = gKey if isinstance(gKey, list) else [gKey]
  22.     gKey = [k for k in gKey if isinstance(k, (str, int))]
  23.     vGen = yieldNestedVals(fObj, gKey)
  24.     if returnAll: return list(vGen)
  25.     for v in vGen: return v
Advertisement
Add Comment
Please, Sign In to add comment