繁体   English   中英

使用python生成分层数据

[英]Generate hierarchical data using python

我需要为 MxN 大小(M 个级别,N 个子级别)创建目录和子目录结构。 Python中是否有任何Tree数据结构可以帮助我做到这一点?

例子:

输入:

3 x 2(3 个级别和 3 个级别中的每个级别的 2 个子级别)

输出:

1

 11
  111
  112
 12
  121
  122

------
2

 21
  211
  212
 22
  221
  222
----
3
 31
  311
  312
 32
  321
  322

有几种不同的数据结构适用于这样的应用程序。

我的第一个直觉是使用矩阵的嵌套字典,因为这将为您提供您正在寻找的多级索引行为,并且可以在纯 Python 中实现。 由于您建议的数据树大小为MxN (因此是矩形),您还可以使用pandas.DataFrame ,它支持类似于嵌套字典的行/列索引。 但最终,我认为numpy.ndarray在可扩展性方面合适

不过,我将提供每个示例。

使用纯 Python

在纯 Python 中,整数的MxN矩阵通常由整数列表的列表表示,其类型提示将是list[list[int]]

具有像2/21这样的level/sublevel对的级别/子level/sublevel/matrix结构的数据可以由像dict[dict[Matrix]]这样的结构表示,这将使完整数据结构的类型提示类似于dict[dict[list[list[int]]]]

以下嵌套字典理解将生成建议的结构并包含与您的示例案例中提供的完全相同的数据:

M = 3
N = 2

data = {
    i : {
        10 * i + j : [
            [i, j, k] for k in range(1, N + 1)
        ] for j in range(1, N + 1)
    } for i in range(1, M + 1)
}

使用pprint.pprint可以看到其结果:

>>> from pprint import pprint
>>> pprint(data)
{1: {11: [[1, 1, 1], [1, 1, 2]], 12: [[1, 2, 1], [1, 2, 2]]},
 2: {21: [[2, 1, 1], [2, 1, 2]], 22: [[2, 2, 1], [2, 2, 2]]},
 3: {31: [[3, 1, 1], [3, 1, 2]], 32: [[3, 2, 1], [3, 2, 2]]}}

然后可以通过其级别和子级别索引检索任何特定矩阵:

>>> data[2][21]
[[2, 1, 1], [2, 1, 2]]

使用pandas.DataFrame

如果您不介意调用第三方库,您可以进一步将其转换为pandas.DataFrame并简化子级索引:

import pandas as pd

M = 3
N = 2

data = {
    i : {
        j : [
            [i, j, k] for k in range(1, N + 1)
        ] for j in range(1, N + 1)
    } for i in range(1, M + 1)
}

df = pd.DataFrame(data)

结果如下:

>>> df
                        1                       2                       3
1  [[1, 1, 1], [1, 1, 2]]  [[2, 1, 1], [2, 1, 2]]  [[3, 1, 1], [3, 1, 2]]
2  [[1, 2, 1], [1, 2, 2]]  [[2, 2, 1], [2, 2, 2]]  [[3, 2, 1], [3, 2, 2]]

其中,使用简化的子级索引,它的元素矩阵如下:

>>> df[2][1]  # Equivalent to data[2][21] in the pure Python example.
[[2, 1, 1], [2, 1, 2]] 

使用numpy.ndarray

此时,您可能会注意到所讨论的数据结构实际上只是MxN矩阵的MxN矩阵。 因此,如果您愿意,可以通过从字典推导切换到列表推导并调用numpy将其减少为MxNxMxN 4D 数组:

import numpy as np

M = 3
N = 2

data = [
    [
        [
            [i, j, k] for k in range(1, N + 1)
        ] for j in range(1, N + 1)
    ] for i in range(1, M + 1)
]

data = np.array(data)

在此示例中,会产生以下形状数组(3, 2, 3, 2)

>>> data
array([[[[1, 1, 1],
         [1, 1, 2]],

        [[1, 2, 1],
         [1, 2, 2]]],


       [[[2, 1, 1],
         [2, 1, 2]],

        [[2, 2, 1],
         [2, 2, 2]]],


       [[[3, 1, 1],
         [3, 1, 2]],

        [[3, 2, 1],
         [3, 2, 2]]]])

对于哪个索引相对于pandas.DataFrame的情况来说是一倍的,因为数组索引从零开始:

>>> data[1][0]  # Equivalent to df[2][1] in the pandas example.
array([[2, 1, 1],
       [2, 1, 2]])

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM