Python:根据给定的 array/list 创建树结构
Python: create tree structure from given array/list
我遇到了问题。
假设我有一个给定的数组,或 4 个单独的列表(列)
P1 L1 V1 O1
P1 L1 V1 O2
P1 L1 V2 O1
P1 L1 V3 O3
P2 L1 V2 O1
P2 L2 V1 O2
P2 L3 V4 O2
我想将其转换为 python 树结构:
P1|
|L1|
|V1|
| |O1
| |O2
| |O3
|V2|
| |O1
|V3|
|O3
P2|
|L1|V2|O1
|L2|V1|O2
|L3|V4|O2
现在好了,这个给定的数组可以根据用户输入而改变,它总是有这种“结构”,但它不是先验定义的。
我的目标是定义这样一个结构,并有可能在最低级别上知道给定 children 的所有 parents。
总而言之,按照@trincot 的建议,我输入了一个 input/output 数据类型:
Input: 4 lists, example:
['P1', 'P1', 'P1', 'P1', 'P1', 'P1', 'P1', 'P1', 'P1', 'P1', 'P1', 'P1', 'P2', 'P2', 'P2', 'P2', 'P2', 'P2', 'P2', 'P2', 'P2', 'P2']
output: One tree structure like this:
{'P1': {'L1': {'V1': {'O1': 'O1'}}, 'L2': {'V2': {'O2': 'O2'}, 'V1': {'O1': 'O1'}}}, 'P2': {'L1': {'V1': {'O1': 'O1'}}, 'L2': {'V2': {'O2': 'O2'}, 'V1': {'O1': 'O1'}}}}
在输出中,我想知道最后一级是什么元素,并知道该元素的所有 parents。
当然,如果其他数据类型更合适,我将不胜感激任何建议。
感谢您的帮助!
我没有看到示例输入和示例输出之间的联系,所以我将猜测您想要什么。
这是一个实现:
# sample input
data = [
['P1', 'P1', 'P1', 'P1', 'P2', 'P2', 'P2'],
['L1', 'L1', 'L1', 'L1', 'L1', 'L2', 'L3'],
['V1', 'V1', 'V2', 'V3', 'V2', 'V1', 'V4'],
['O1', 'O2', 'O1', 'O3', 'O1', 'O2', 'O2']
]
forest = {}
for *path, last in zip(*data):
node = forest
for code in path:
node = node.setdefault(code, {})
node[last] = last
在 运行 这段代码之后,forest
将是以下嵌套字典:
{
"P1": {
"L1": {
"V1": {
"O1": "O1",
"O2": "O2"
},
"V2": {
"O1": "O1"
},
"V3": {
"O3": "O3"
}
}
},
"P2": {
"L1": {
"V2": {
"O1": "O1"
}
},
"L2": {
"V1": {
"O2": "O2"
}
},
"L3": {
"V4": {
"O2": "O2"
}
}
}
}
我遇到了问题。
假设我有一个给定的数组,或 4 个单独的列表(列)
P1 L1 V1 O1
P1 L1 V1 O2
P1 L1 V2 O1
P1 L1 V3 O3
P2 L1 V2 O1
P2 L2 V1 O2
P2 L3 V4 O2
我想将其转换为 python 树结构:
P1|
|L1|
|V1|
| |O1
| |O2
| |O3
|V2|
| |O1
|V3|
|O3
P2|
|L1|V2|O1
|L2|V1|O2
|L3|V4|O2
现在好了,这个给定的数组可以根据用户输入而改变,它总是有这种“结构”,但它不是先验定义的。
我的目标是定义这样一个结构,并有可能在最低级别上知道给定 children 的所有 parents。
总而言之,按照@trincot 的建议,我输入了一个 input/output 数据类型:
Input: 4 lists, example:
['P1', 'P1', 'P1', 'P1', 'P1', 'P1', 'P1', 'P1', 'P1', 'P1', 'P1', 'P1', 'P2', 'P2', 'P2', 'P2', 'P2', 'P2', 'P2', 'P2', 'P2', 'P2']
output: One tree structure like this:
{'P1': {'L1': {'V1': {'O1': 'O1'}}, 'L2': {'V2': {'O2': 'O2'}, 'V1': {'O1': 'O1'}}}, 'P2': {'L1': {'V1': {'O1': 'O1'}}, 'L2': {'V2': {'O2': 'O2'}, 'V1': {'O1': 'O1'}}}}
在输出中,我想知道最后一级是什么元素,并知道该元素的所有 parents。
当然,如果其他数据类型更合适,我将不胜感激任何建议。
感谢您的帮助!
我没有看到示例输入和示例输出之间的联系,所以我将猜测您想要什么。
这是一个实现:
# sample input
data = [
['P1', 'P1', 'P1', 'P1', 'P2', 'P2', 'P2'],
['L1', 'L1', 'L1', 'L1', 'L1', 'L2', 'L3'],
['V1', 'V1', 'V2', 'V3', 'V2', 'V1', 'V4'],
['O1', 'O2', 'O1', 'O3', 'O1', 'O2', 'O2']
]
forest = {}
for *path, last in zip(*data):
node = forest
for code in path:
node = node.setdefault(code, {})
node[last] = last
在 运行 这段代码之后,forest
将是以下嵌套字典:
{
"P1": {
"L1": {
"V1": {
"O1": "O1",
"O2": "O2"
},
"V2": {
"O1": "O1"
},
"V3": {
"O3": "O3"
}
}
},
"P2": {
"L1": {
"V2": {
"O1": "O1"
}
},
"L2": {
"V1": {
"O2": "O2"
}
},
"L3": {
"V4": {
"O2": "O2"
}
}
}
}