Генераторная версия ответа Грэдди recurse()
выше, который не должен взрываться на строках, а также дает вам составной ключ (след крошки печенья?), Показывающий, как вы достигли определенного значения:
def recurse(d, keys=()):
if type(d) == dict:
for k in d:
for rv in recurse(d[k], keys + (k, )):
yield rv
else:
yield (keys, d)
for compound_key, val in recurse(eg_dict):
print '{}: {}'.format(compound_key, val)
производит вывод (используя пример словаря, приведенный в вопросе):
('key_1',): value_1
('key_2', 'key_21'): [(2100, 2101), (2110, 2111)]
('key_2', 'key_22'): ['l1', 'l2']
('key_2', 'key_23', 'key_231'): v
('key_2', 'key_24', 'key_241'): 502
('key_2', 'key_24', 'key_243', 'key_2433'): [(11451, 0), (11452, 0)]
('key_2', 'key_24', 'key_243', 'key_2432'): 504
('key_2', 'key_24', 'key_243', 'key_2431'): [0, 0]
('key_2', 'key_24', 'key_242'): [(5, 0), (7, 0)]
('key_2', 'key_24', 'key_244', 'key_2441'): ['ll1', 'll2']
В Python 3 второй цикл выхода должен быть заменен на yield from
. Этот генератор можно сделать более общим, заменив тест type(d) == dict
на isinstance(d, collections.Mapping)
, используя Азбуку сопоставления из модуля коллекций.