Skip to content

Instantly share code, notes, and snippets.

@JakeCowton
Created November 12, 2021 11:35
Show Gist options
  • Save JakeCowton/4ae9d54f7a9a85b15282725aaa9f79f9 to your computer and use it in GitHub Desktop.
Save JakeCowton/4ae9d54f7a9a85b15282725aaa9f79f9 to your computer and use it in GitHub Desktop.
Finding the dict, within a many nested JSON objects, containing a given key, value, or key-value pair
def find_dict_containing_key(d, key):
"""
:param d: dict
:param key: the key to look for
:returns: the nested dict containing key
"""
if isinstance(d, list):
for i in d:
if isinstance(i, dict) or isinstance(i, list):
item = find_dict_containing_key(i, key)
if item:
return item
else:
if key in d.keys():
return d
for v in d.values():
if isinstance(v, dict) or isinstance(v, list):
item = find_dict_containing_key(v, key)
if item:
return item
def find_dict_containing_value(d, value):
"""
:param d: dict
:param value: the value to look for
:returns: the nested dict containing value
"""
if isinstance(d, list):
for i in d:
if isinstance(i, dict) or isinstance(i, list):
item = find_dict_containing_value(i, value)
if item:
return item
else:
if value in d.values():
return d
for v in d.values():
if isinstance(v, dict) or isinstance(v, list):
item = find_dict_containing_value(v, value)
if item:
return item
def find_dict_containing_key_value(d, key, value):
"""
:param d: dict
:param key: the key to look for
:param value: the value corresponding to `key` to look for
:returns: the nested dict containing value
"""
if isinstance(d, list):
for i in d:
if isinstance(i, dict) or isinstance(i, list):
item = find_dict_containing_value(i, value)
if item:
return item
else:
if d.get(key) == value:
return d
for v in d.values():
if isinstance(v, dict) or isinstance(v, list):
item = find_dict_containing_value(v, value)
if item:
return item
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment