表示任意分层数据的最佳数据结构是什么?

问题描述

在具有任意数量子级的分层数据(例如文件夹/文件布局)中表示/读取的最佳数据结构是什么?我见过 N-ary 树并尝试过,k/d-ary 堆等......但是,似乎您至少需要知道每个节点在每个这些结构中拥有的最大子节点数。但是,是否有任何类型的结构可以表示任何分层数据而无需了解它,除了它以某种方式分层的事实之外?我并不太担心优化以获得如此好的性能,因为我认为我不需要处理大量数据(如果可以优化那就太好了),重要的方面是能够在一些随机层次结构中读取数据并维护所述数据的组织。

#example data

root
   - group1
      - subgroup1
         - child
         - child
             - data
      - subgroup2
      - subgroup3
         - child
             - data
   - group2
      - subgroup1
   - group3
      - subgroup1
         - child
             - data
      - subgroup2
         - child
             - data
   - group4
      - subgroup1
      - subgroup2
      - subgroup3
      - subgroup4

同样,格式可以是任意的,可能有 0-500 个组,每个组都有一些任意数量的嵌套子项/路径...

关于上下文是否需要更多信息:

我希望能够读取任何 h5 文件的布局,而无需专门为 h5 文件编写代码或严格组织每个具有相同布局的 h5 文件。这样我就可以创建一个 GUI,用户可以在其中导航 h5 文件(我正在与不熟悉编程并希望尽可能自动化/拥有 GUI 的科学家一起工作)。我已经看过 h5py 和 pandas,但是通过这些库获取键不会以易于使用的方式对它们进行排序/返回来表示文件布局(pandas 返回 h5 文件布局的叶节点,h5py 在每个层次结构级别中读取,并且您需要事先知道密钥,因此很难遍历和组织文件布局)。截至目前,我能够使用这些库从 h5 文件中解析键、组和子组等,但我无法维护路径。为此目的使用嵌套元组似乎过于复杂和混乱,这就是为什么我想知道其他更复杂的数据结构。

此外,我需要在 Python 中完成此操作,因为它是我的同事使用的唯一语言,他们不想学习其他语言(并非出于无知,他们只是不是程序员......)。

解决方法

为了说明我对自描述的意思,这里有一个非常简单的示例,它使用 .visititems() 递归访问层次结构中的每个 HDF5 对象。修改以在 h5py.File() 调用中引用您的文件,您可以看到输出。您将获得 2 个包含组和数据集名称的列表,可用于填充 GUI。

注意:如果您返回一个值,则 .visititems() 递归结束。如果您想迭代 main() 例程中的架构,您需要创建一个生成器并生成名称。

def get_h5_grps_dsets(name,h5_obj):
    
    if isinstance(h5_obj,h5py.Group):
        #print(name,'is a Group')
        grp_list.append(name)
    elif isinstance(h5_obj,h5py.Dataset):
        #print(name,'is a Dataset')
        ds_list.append(name)

with h5py.File(file_path,'r') as h5r:
    
    grp_list = []
    ds_list = []    
    
    h5r.visititems(get_h5_grps_dsets)
    print('\nGroups:')
    for grp in grp_list:
        print(grp)
    print('\nDatasets:')
    for ds in ds_list:
        print(ds)