Сглаживание вложенного словаря с возможным списком словарей в python - PullRequest
0 голосов
/ 01 декабря 2018

У меня есть вложенные (словари) и (список словарей) - круглые скобки для ясности - вроде следующего:

{"k": 
  {"hello": "bye",
   "hi": [{"a": "b", "c": "d"}, {"q": "I", "o": "p"}]
  }
}

И я хочу сгладить его в путь, подобный следующему:

"k/hello/bye/hi/a/b/c/d/q/I/o/p"

Как это можно сделать?Может быть больше слоев словарей (даже в списках), поэтому мне нужно очень масштабируемое решение.

Спасибо, Джек

1 Ответ

0 голосов
/ 01 декабря 2018

Рекурсивное решение

При первом запуске рекурсия практически не работает, думаю, мне повезло:

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())

, который будет сортировать по алфавиту по умолчанию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...