Предполагая, что вам нужна фиксированная глубина (большинство других ответов, по-видимому, предполагают, что вы хотите вернуться к максимальной глубине), и вам нужно сохранить путь, как в исходном вопросе, вот самое простое решение:
def process_dict(d, depth, callback, path=()):
for k, v in d.iteritems():
if depth == 1:
callback(path + (k,), v)
else:
process_dict(v, depth - 1, callback, path + (k,))
Вот пример этого в действии:
>>> a_dict = {
... 'dog': {
... 'red': 5,
... 'blue': 6,
... },
... 'cat': {
... 'green': 7,
... },
... }
>>> def my_callback(k, v):
... print (k, v)
...
>>> process_dict(a_dict, 1, my_callback)
(('dog',), {'blue': 6, 'red': 5})
(('cat',), {'green': 7})
>>> process_dict(a_dict, 2, my_callback)
(('dog', 'blue'), 6)
(('dog', 'red'), 5)
(('cat', 'green'), 7)