конвертировать вложенные словари в список списка - PullRequest
0 голосов
/ 22 мая 2018

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

{
  "g": {
    "o": {}
  },
  "h": {
    "p": {}
  },
  "e": {
    "v": {},
    "m": {
      "s": {}
    }
  },
  "f": {
    "n": {}
  },
  "a": {
    "i": {}
  },
  "d": {
    "u": {},
    "l": {
      "r": {}
    }
  },
  "b": {
    "j": {}
  },
  "c": {
    "t": {},
    "k": {
      "q": {
        "z": {}
      }
    }
  }
}

Есть ли быстрый способ преобразовать его в список списков, чтобы получить следующий вывод:

 [g, o]
 [h, p]
 [e, v]
 [e, m, s]
 [f, n]
 [a, i]
 [d, u]
 [d, l, r]
 [b, j]
 [c, t]
 [c, k, q, z]

мы останавливаемся, когда встречаем пустой словарь.Например, мы начинаем с «g», у него есть дочерний элемент «o», который в свою очередь не имеет дочерних элементов, поэтому список состоит из «g» и «o».

другой пример: начиная с «e», потомками являются «v» и «m», а «m» имеет «s».Таким образом, у нас есть два списка: один с «e» и «v», а другой с «e», «v» и «m».

Я пытался создать рекурсивную функцию, но, к сожалению, она не удалась.

1 Ответ

0 голосов
/ 23 мая 2018

Это должно быть довольно быстро, используя рекурсивную функцию с генераторами:

def paths(tree, cur=()):
    if not tree:
        yield cur
    else:
        for n, s in tree.items():
            for path in paths(s, cur+(n,)):
                yield list(path)

Для использования:

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