[英]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 中,整數的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.