У меня есть словарь списков:Создать иерархию из словаря списков
a = {
'a': [1, 2, 3],
'b': [1, 2, 4],
'c': [1, 2],
'd': [1, 2, 3, 4, 5],
'e': [3],
'f': [3, 7],
'g': [3, 3],
'h': [3, 3, 3, 3, 3],
'i': [3, 3, 3, 3, 4],
}
И я хотел бы создать иерархическую структуру из этого словаря, который будет группируют элементы в подобной манере (точная структура не имеет значения , а также соотношение между элементами сохраняется):
/\
/ \
e c
/\ /\
f g a b
/\ |
h i d
иерархия выглядит следующим образом: массив g
является префиксом массива h
и i
и, следовательно, является их предком. Но e
является префиксом g
, так что e
является предком g
.
Вот моя идея, как достичь этого результата.
- Сортировка словаря на основе количества элементов в списке, который мне удалось достичь с
s = sorted(a.items(), key=lambda e: len(e[1]))
. Это даст мне следующую структуру:
.
('e', [3])
('c', [1, 2])
('g', [3, 3])
('f', [3, 7])
('a', [1, 2, 3])
('b', [1, 2, 4])
('d', [1, 2, 3, 4, 5])
('h', [3, 3, 3, 3, 3])
Сейчас я могу найти прародитель перебирая элементы и проверок, если элемент является префиксом других элементов. Начиная с первого.
e
является префиксомg
,f
иh
. Иc
является префиксомa
,b
,d
. Итак, эти два элемента - родители.сейчас я понимаю, что я должен использовать рекурсию для ввода внутри каждого родителя и для выполнения той же операции, но я не смог найти правильное решение.
Так же кто-нибудь знает, как подойти к этой проблеме. Или я слишком усложняю ситуацию, и есть более простой способ достичь решения.
P.S. это не задание на домашнее задание или вопрос с интервью (также может быть). Это просто моя абстракция от проблемы, которую я пытаюсь решить.
Я действительно не понимаю, почему вы нужна рекурсия (думаю, я уверен, что ее можно каким-то образом использовать). Чтобы сделать это в n^2, для каждого элемента проверьте все остальные элементы, чтобы узнать, являются ли они его дочерним элементом. После этого вам нужно сделать ... – Hammer
также вам не нужно проверять все остальные элементы, только те, что после него в вашем отсортированном списке (по длине) – Hammer
Мне кажется, что вы ищете trie (aka prefix tree). [См. trie on wikipedia] (http://en.m.wikipedia.org/wiki/Trie) –