2016-04-26 3 views
2
def solution(dict, output, ini): 
    if (dict == None): 
     return None 
    else: 
     for key in dict: 
      if str(type(dict[key])) != str(type({})): 
       print(key) 
       output[ini + key] = dict[key] 
      else: 
       return solution(dict[key], output, ini + key + '.') 
    return output 

a = { 
    'Key1': '1', 
    'Key2': { 
     'a': '2', 
     'b': '3', 
     'c': { 
      'd': '3', 
      'e': '1' 
     } 
    } 
} 
print(solution(a, {}, "")) 

Здравствуйте, я пытаюсь сделать функцию, которая выравнивает вложенный словарь.Почему этот вывод каждый раз возвращает разное значение?

Например, необходимо напечатать:

{'Key2.b': '3', 'Key1': '1', 'Key2.c.d': '3', 'Key2.a': '2', 'Key2.c.e': '1'} 

Но сейчас код случайным образом возвращает мне правильный ответ, но из диапазона 0-5, таких как

{'Key2.b': '3', 'Key1': '1', 'Key2.c.d': '3', 'Key2.a': '2'}, 
{'Key2.b': '3', 'Key2.c.d': '3'} 

я узнал, что если я избавлюсь от «return» в своем заявлении else, это сработает, но я не уверен, почему это так? Может кто-нибудь мне помочь?

ответ

1

Когда вы перебираете ключи в dict с for key in dict:, он будет возвращать ключи в случайном порядке, так как элементы в словарях не упорядочены. Если обрабатывается Key1, оно будет добавлено к выходу, а на следующей итерации будет рекурсивно обработано Key2. Теперь, если порядок отличается и Key2 обрабатывается сначала, то return solution(dict[key],output,ini+key+'.') приведет к возврату результата до того, как Key1 будет добавлен в вывод. То же самое происходит с вложенными элементами в пределах Key2. Если вы удалите оператор return, тогда все ключи будут обработаны независимо от порядка итераций, и вы получите ожидаемый результат.

0

как вы выразились результат в output, вы не должны return на else, в противном случае, цикл for сломается, а ключи остальные будут проигнорированы. (Просто удалить return, и он будет делать работу)

Смежные вопросы