【问题标题】:How to convert python list of tuples into tree?如何将元组的python列表转换为树?
【发布时间】:2017-01-22 14:00:20
【问题描述】:

我有一个像这样的元组列表

list_of_tuples = [(number, name, id, parent_id),
     (number, name, id, parent_id),
    ]

我正在尝试将其排序为有序结构,例如:

{
    parent: [(id, name), (id, name)],
    parent: {parent: [(id, name)]
{

因此,任何节点都可以有父节点和/或子节点 我试过了:

tree = defaultdict(lambda: [None, ()])
ancestors = set([item[3] for item in list_of_tuples])

for items in list_of_tuples:
    children_root = {}
    descendants = []
    number, name, id, parent = items
    if parent is None:
        tree[id] = [(id, name)]
    elif parent:
        if parent not in tree.keys():
            node = tree.get(parent)
            node.append((id, name))
        children = (id, name)
        tree[parent].append(children)

但是当一个节点同时有父节点和子节点时,我会失去深层层次结构

如何使订购正常工作?

【问题讨论】:

  • 如果按parent_id对节点进行排序,从叶节点到源节点,这可能只是问题
  • 为什么不直接用 key = id 做一个字典。
  • 您的目标结构有点不寻常。通常一个树节点有关于孩子而不是父母的信息。还有哪些信息与特定节点相关(因为它将在树/ dict 中)? 身份证姓名?但不是 number?
  • id 与每个节点相关
  • 这个号码是干什么用的?

标签: python algorithm tree binary-search-tree


【解决方案1】:

我建议将树节点表示为元组 ((id, name), dict_of_children)。

list_of_tuples = [(1, 'name1', 1, None),
     (2, 'name2', 2, 1),
     (3, 'name3', 3, 1),
     (4, 'name4', 4, 2),
     (5, 'name5', 5, 2),
     (6, 'name5', 6, None),
     (7, 'name5', 7, 6),
    ]

def build_tree(list_of_tuples):
    """
    >>> import pprint
    >>> pprint.pprint(build_tree(list_of_tuples))
    {1: ((1, 'name1'),
         {2: ((2, 'name2'), {4: ((4, 'name4'), {}), 5: ((5, 'name5'), {})}),
          3: ((3, 'name3'), {})}),
     6: ((6, 'name5'), {7: ((7, 'name5'), {})})}
    """
    all_nodes = {n[2]:((n[2], n[1]), {}) for n in list_of_tuples}
    root = {}
    for item in list_of_tuples:
        number, name, id, parent = item
        if parent is not None:
            all_nodes[parent][1][id] = all_nodes[id]
        else:
            root[id] = all_nodes[id]
    return root

【讨论】:

  • 只返回最深的嵌套对,但它可以用来打开浅表或元组中的嵌套层次!好!
  • 它只需要一个根节点,可以修改它以使用多个根。
  • 我已经编辑了,现在它接受多个根节点
猜你喜欢
  • 1970-01-01
  • 2011-07-27
  • 2017-07-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-11
相关资源
最近更新 更多