Вот подход, который позволяет вам собрать все значения из вложенного dict, если ключи повторяются на разных уровнях вложенности. Это очень похоже на приведенный выше ответ, просто обернут в функцию с нелокальным списком для хранения результатов:
def foo(mydict, mykey):
result = []
num_recursive_calls = 0
def explore(mydict, mykey):
#nonlocal result #allow successive recursive calls to write to list
#actually this is unnecessary in this case! Here
#is where we would need it, for a call counter:
nonlocal num_recursive_calls
num_recursive_calls += 1
for key in mydict.keys(): #get all keys from that level of nesting
if mykey == key:
print(f"Found {key}")
result.append({key:mydict[key]})
elif isinstance(mydict.get(key), dict):
print(f"Found nested dict under {key}, exploring")
explore(mydict[key], mykey)
explore(mydict, mykey)
print(f"explore called {num_recursive_calls} times") #see above
return result
Например, с
data = {'x': {'y': {'key': {}, 'w': {}}}, 'key': 'duplicate'}
Это вернет:
[{'key': {}}, {'key': 'duplicate'}]