首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >遍历Python中的层次结构

遍历Python中的层次结构
EN

Stack Overflow用户
提问于 2016-06-05 12:02:26
回答 2查看 989关注 0票数 0

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

代码语言:javascript
运行
复制
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的子组,等等。任何帮助都是非常感谢的。我不知道要创建什么样的数据结构,所以我可以迭代它。谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-06-05 12:14:47

您会问“我应该在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标记,空白项可以是另一个空项,如''。下面是显示示例结构的代码和打印出来的代码。

代码语言:javascript
运行
复制
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之后更改这两行。以上代码的打印输出如下

代码语言:javascript
运行
复制
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并从JSON中恢复是很容易的。这应该可以满足您的需要,当然,也可以对结构或代码进行一些修改。

票数 1
EN

Stack Overflow用户

发布于 2016-06-05 12:40:17

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37641649

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档