Recursively Iterate Through A Nested Dict And Return Value Of The First Matching Key
I have a deeply nested dict and need to iterate through it and return the value corresponding to the key argument, second argument of my function. For example, with tree = {'a': 12
Solution 1:
You have to check whether the recursive call actually found something so you can continue the loop. E.g. try the following:
deftree_traverse(tree, key):
if key in tree:
return tree[key]
for v infilter(dict.__instancecheck__, tree.values()):
if (found := tree_traverse(v, key)) isnotNone:
return found
Solution 2:
Here we instantiate an object when the function is created, that all executions of the function will share, called _marker
. We return this object if we don't find the key. (You could also use None
here, but None
is frequently a meaningful value.)
deftree_traverse(tree, key, *, _marker=object()):
for k,v in tree.items():
ifisinstance(v, dict):
res = tree_traverse(v, key, _marker=_marker)
if res isnot _marker:
return res
elif k == key:
return v
return _marker
deffind(tree, key):
_marker = object()
res = tree_traverse(tree, key, _marker=_marker)
if res is _marker:
raise KeyError("Key {} not found".format(key))
return res
I use tree_traverse
as a helper function because we want different behaviour at the outermost layer of our recursion (throw an error) than we want inside (return a _marker
object)
Post a Comment for "Recursively Iterate Through A Nested Dict And Return Value Of The First Matching Key"