Вам придется сгладить структуру словаря, сохранив иерархию ключей, соответствующую каждому значению. Затем используйте функцию min в выровненном списке и на основе этого создайте свой вложенный результат tuple / dict.
K1,K2,K3,V3 = min( (K1,K2,K3,V3) for K1,V1 in fault.items() for K2,V2 in V1 for K3,V3 in V2),key=lambda r:r[-1])
result = (K1,(K2,{K3:V3}))
Если число уровней может варьироваться, вам нужно будет создать рекурсивную функцию для выравнивания словаря. .
def flatDict(D):
for K,V in D.items():
if isinstance(V,dict):
for KVn in flatDict(V):
yield (K,)+KVn
else:
yield (K,V)
*keys,lastKey,value = min(flatDict(fault),key=lambda r:r[-1])
result = {lastKey:value}
for key in reversed(keys):
result = (key,result)
обратите внимание, что ваша результирующая структура вложенных кортежей будет довольно сложной для использования, если количество уровней изменится. Возможно, вы захотите рассмотреть простой кортеж, возвращаемый функцией flatDict ()