Рекурсивное решение
При первом запуске рекурсия практически не работает, думаю, мне повезло:
def traverse(struct):
if isinstance(struct, dict):
return '/'.join(k+'/'+traverse(v) for k,v in struct.items())
elif isinstance(struct, list):
return '/'.join(traverse(v) for v in struct)
else:
return struct
, что дает:
'k/hello/bye/hi/a/b/c/d/q/I/o/p'
почему?
Каждый вызов функции traverse
принимает аргумент struct
, который может быть словарём, списком или строкой.
Если это словарь, мыобъедините все значения, за которыми следует результат обхода соответствующих ключей.Затем мы возвращаем эту строку.
Аналогично, если это список, мы объединяем результаты обхода всех элементов и возвращаем результат.
Наконец, если аргумент struct
простострока, мы возвращаем ее нашему родителю.
В каждом случае каждая функция не знает об износе, она находится в стеке вызовов, она просто знает, что было ее аргументом struct
, и возвращает правильный ответ для, что , аргумент.
Это то, что так круто в рекурсии, вам нужно рассмотреть только один случай, если вы пишете это правильно и передаете правильные вещи от родителя к ребенку.результат получается только благодаря сотрудничеству.
NB. Как отмечается в комментариях @DanielMeseko
, словари не упорядочены, например, части hello
и hi
окончательной строкимогли бы «поменяться местами» (вместе с их дочерними деревьями).
update
Чтобы сделать словари отсортированными по алфавитному расположению клавиш, мы простонужно используйте функцию sorted()
для результата из struct.items()
.
То есть, чтобы остаться: замените struct.items()
в приведенном выше коде на:
sorted(struct.items())
, который будет сортировать по алфавиту по умолчанию.