我有一个列表的词典:从列表的字典创建层次
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(又名前缀树)[见维基百科上的字典](http://en.m.wikipedia.org/wiki/Trie) –