我需要为MxN大小(M级,N级)创建目录和子目录结构.Python中是否有任何树数据结构可以帮助我做到这一点?
示例:
输入:
3x2(3个级别和2个分级别,每个3个级别)
输出:
1
11
111
112
12
121
122
------
2
21
211
212
22
221
222
----
3
31
311
312
32
321
322发布于 2022-06-02 21:05:05
对于这样的应用程序,有几个不同的数据结构可以工作。
我的第一个直觉是使用嵌套的矩阵字典,因为这将给您提供您要寻找的多层次索引行为,并且可以用纯Python实现。由于建议的数据树的大小是MxN (因此是矩形的),所以也可以使用pandas.DataFrame,它支持类似嵌套字典的行/列索引。但最终,我认为numpy.ndarray就是在可伸缩性方面更适合。
不过,我将提供每一个例子。
使用纯Python
在纯Python中,整数的MxN矩阵通常由整数列表表示,其类型提示为list[list[int]]。
像level/sublevel/matrix这样具有level/sublevel对(如2/21 )的数据可以用像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矩阵。因此,如果您愿意,可以通过从字典理解转换为列表理解和调用MxNxMxN 4D数组将其简化为一个numpy 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]])https://stackoverflow.com/questions/72481251
复制相似问题