我有一个列表字典:
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. 这不是作业或面试题(也可能是)。这只是我尝试解决问题时的抽象。