迭代Python中的层次结构

时间:2016-06-05 12:02:26

标签: python data-structures hierarchy

我在数据集中有一组编号的组,这些组是按层次组织的。每个组都有一个编号的标题,并有该组的几个成员。例如:

01 : Tony, John, Meredith
01.01 : Alex, Fred, Melissa
02 : Alley, Henry, Natalie
02.01.02 : Chris, Pete
03 : Andrew
03.01 : Nancy, Peter, Harold

我应该在python中使用什么数据结构来组织这些组?我需要维护层次结构,以便01.01是0.1的子级。数据结构深达7级,如:01.03.01.01.02.04.05,该组是01.03.01.01.02.04组的子级,依此类推。任何帮助深表感谢。我不确定要创建什么数据结构,所以我可以迭代它。感谢。

2 个答案:

答案 0 :(得分:1)

你问“我应该在python中使用什么数据结构来组织这些组?”

自上而下编程的一个关键原则是,在决定将对结构进行的操作以及它们的相对频率和任何其他标准(例如)之前,您不会决定抽象数据结构的实现。简单和内存使用)。您尚未说明这些信息,因此我们无法推荐具体的实施方案。

我可以想出许多方法来做你所要求的:树,列表中的列表,字典中的字典等。每种方法都有其优点和缺点。关于一点,我确实很奇怪。在你的结构中,新子级别的每个项目都以'01'开头,但'02 .01.02:Chris,Pete'除外,它以'02'开头。这是故意的吗?如果你保持其他明显的编号,那就会打开一些更简单的实现。

通过评论中添加的信息,我建议使用嵌套列表。每个数据项都有一系列以零结尾的索引,结构中的任何其他内容都是包含其他数据项和列表的列表。在您的示例中,如果我们将整个结构命名为a,则项01为a[1][0],项01.01位于a[1][1][0],项02.01.02位于a[2][1][2][0],等等。此结构允许稍后插入更多项目,因此我们可以轻松添加项目01.01.01而不会打扰其他项目。不需要在结构中存储项目编号:它们是从结构中数据项的位置直接推断出来的。

此实现还允许整个结构具有数据项,该数据项具有空项目编号并存储在a[0]中。可以通过None标记缺失的数据项,空白项可以是另一个空项,例如''。下面是代码,显示了打印出来的示例结构和代码。

def print_structure(structure, level=''):
    """Iterate through a heirarchical data structure, printing the data
       items with their level numbers"""
    for i, item in enumerate(structure):
        if i == 0:
            # Process each data item appropriately
            if item is not None:
                print(level + ' : ' + str(item))
        else:
            new_level = format(i, '02')
            if level:
                new_level = level + '.' + new_level
            print_structure(item, new_level)


a = [None,
     ['Tony, John, Meredith',
      ['Alex, Fred, Melissa']],
     ['Alley, Henry, Natalie',
      [None,
       ['?'],
       ['Chris, Pete']]],
     ['Andrew',
      ['Nancy, Peter, Harold']]]

print_structure(a)

在此实现中,每个“组”都是一个字符串。我把组'?'放在你说组存在的地方,但没有说明它是什么,我把None放在你没有说数据项存在的地方。要修改结构的处理,只需在注释Process each data item appropriately之后更改两行。上述代码的打印输出是

01 : Tony, John, Meredith
01.01 : Alex, Fred, Melissa
02 : Alley, Henry, Natalie
02.01.01 : ?
02.01.02 : Chris, Pete
03 : Andrew
03.01 : Nancy, Peter, Harold

从JSON保存和恢复很容易。这应该满足您的需求,当然,可以对结构或代码进行一些修改。

答案 1 :(得分:0)

如果你的主要目标是生成一个JSON友好的结构,你可以写出来,使用嵌套的词典(如果元素的顺序很重要,则使用OrderedDict)。它保持简单,用json写出来将是微不足道的。每个字典可以有一个键members(一个列表或一组直接分配给它的子项),以及一个键subgroups,它是子词典的列表或词典。它不难创建,因为父组的标题是子组的前缀。