当前位置: 首页 > 面试题库 >

给定一个(父,子)的平面列表,创建一个分层的字典树[关闭]

楮杰
2023-03-14
问题内容

已关闭 。这个问题需要更加集中。它当前不接受答案。

想改善这个问题吗? 更新问题,使其仅通过编辑此帖子来关注一个问题。

3年前关闭。

改善这个问题

我有一个包含元组的列表,其中包含名称。这些名称是父名称和子名称,我想用它们的名称创建一个分层的字典树。例如,我有以下列表:

[('john','marry'),('mike','john'),('mike','hellen'),('john','elisa')]

我想创建这个:

{
    'mike':{
        'john':{
            'marry':{}
            'elisa':{}
         }
         'hellen':{}
        }
}

问题答案:

假设它的行为良好(没有循环,没有重复的名称或一个孩子有多个父母),您可以简单地使用“有向图”并遍历它。为了找到根,我还使用了一个包含布尔值的字典,该布尔值指示该名称是否存在任何父项:

lst = [('john','marry'), ('mike','john'), ('mike','hellen'), ('john','elisa')]

# Build a directed graph and a list of all names that have no parent
graph = {name: set() for tup in lst for name in tup}
has_parent = {name: False for tup in lst for name in tup}
for parent, child in lst:
    graph[parent].add(child)
    has_parent[child] = True

# All names that have absolutely no parent:
roots = [name for name, parents in has_parent.items() if not parents]

# traversal of the graph (doesn't care about duplicates and cycles)
def traverse(hierarchy, graph, names):
    for name in names:
        hierarchy[name] = traverse({}, graph, graph[name])
    return hierarchy

traverse({}, graph, roots)
# {'mike': {'hellen': {}, 'john': {'elisa': {}, 'marry': {}}}}


 类似资料:
  • 我正在为一棵树创建一个python类,其中每个节点都有一个由“order”给定的子节点(但每个子节点只有一个节点)。我有一个方法,children(self,I),它返回索引I处节点的子节点。我需要实现parent(self,I),它将获得索引I处子节点的父节点。 到目前为止,我有以下信息: order=2和list[45,2,123,1,8,40,456]表示的示例树如下所示: 我知道可能有一种

  • 问题内容: 我有对象T的列表,它具有父属性,其中顶级对象的父属性为null。我想将所有对象放入TreeSet(或TreeMap)中。顶级对象将是所有没有父级的根对象(父级为null),并且它们的下级将是其子级。 像这样 所以我可以得到Ra并找到它的子代(Ca1,Ca2,Ca11,Ca12…。) 更新:很抱歉,可能不清楚,节点指向父节点,如果parent为null,则它们是根节点。问题是父母需要了解

  • 问题内容: 我只想在给定列表中创建 一行 字典。字典的键将是索引,值将是列表的元素。像这样: 输出: 关于我为什么要 一条 线,我没有任何具体要求。我只是在探索python,想知道是否有可能。 问题答案: 将产生 返回一个枚举对象。 sequence 必须是序列, 迭代器 或其他支持迭代的对象。所返回的迭代器的方法返回,其中包含一个计数(从 start开始 ,默认为0)以及从对 序列进行 迭代获得

  • 问题内容: 我有一个带有字段的“页面”对象列表。此父字段引用列表中的另一个对象。我想基于此字段从此列表创建树层次结构。 这是我原始列表的样子: 我想将其转换为这样的树结构: 我希望可以在任何时候针对任意列表调用的可重用函数。有人知道解决这个问题的好方法吗?任何帮助或建议,将不胜感激! 问题答案: 小提琴

  • 问题内容: 我有一堆名称-父母名对,我想将其变成尽可能少的分层树结构。因此,例如,这些可能是配对: 需要将其转换为一个或多个分层树: 我想要的最终结果是一组嵌套元素,每个元素都包含孩子的名字。 配对中没有不一致的地方(子代是它自己的父代,父代是子代的子代,等等),因此可以进行大量优化。 在PHP中,如何从包含child => parent对的数组转到一组Nested ? 我感觉涉及到递归,但是我还

  • 如果我们要在左子树中找到节点,甚至在根节点上,它会给出正确的输出,但是如果我们在右边找到任何节点,比如根->right,即节点70,它会给出错误的输出20、30、40、50、60。我知道我在哪里犯了错误,我应该如何修改代码,这样对于输入70,只有它的左子树,即,节点60是打印的。

  • 如何创建一个可以容纳10个元素的空列表? 之后,我想在该列表中分配值。例如: 但是,这会导致<code>索引器:列表分配索引超出范围。为什么? 在Python中,列表没有设置的容量,但不可能分配给尚未存在的元素。这里的答案显示了创建一个包含10个“伪”元素的列表的代码,以便稍后替换。然而,大多数遇到这个问题的初学者实际上只是想通过向列表中添加元素来构建列表。这应该使用方法,尽管通常会有特定于问题的

  • 问题 你有一个字典列表,你想根据某个或某几个字典字段来排序这个列表。 解决方案 通过使用 operator 模块的 itemgetter 函数,可以非常容易的排序这样的数据结构。 假设你从数据库中检索出来网站会员信息列表,并且以下列的数据结构返回: rows = [ {'fname': 'Brian', 'lname': 'Jones', 'uid': 1003}, {'fname