python - 解析列表中的嵌套字典以在新列表中存储 parent 和 child 关系
python - parse nested dictionaries in list to store parent & child relationships in new list
我解析了一个 mvn 依赖树来创建一个存储信息的列表。我希望能够浏览此列表并在新列表中存储 parent + child 组合。解析后的 mvn 树的摘录如下(使用 pprint)& 我添加了带有 # 的注释以更明确地显示关系。
[({'name': '"org.antlr antlr4"'}, #parent1
{'children': [({'name': '"org.antlr antlr4-runtime"'}, #child1-1
({'name': '"org.antlr antlr-runtime"'}, #child1-2
({'name': '"org.antlr ST4"'}, #child1-3
({'name': '"org.abego.treelayout org.abego.treelayout.core"'}, child1-4 & parent2
{'children': [({'name': '"org.hamcrest hamcrest-core"'}, #child2-1
({'name': '"org.slf4j slf4j-log4j12"'}, #parent3
{'children': [({'name': '"org.apache.commons commons-lang3"'})] #child3-1
这是我的乱七八糟的尝试:
def relate(tree):
for name, subtree in tree.items():
group, artifact = name.split(":")
g = "groupId:" + group
a = "artifactId:" + artifact
c = {"children": "children"}
family = []
parent = name.group + name.artifact
if subtree:
for c in subtree:
child = name.group + name.artifact
family.append((parent, child))
return family
有没有一种方法可以遍历此列表和return一个新列表,其中return的信息如下所示?
[[nameParent1, nameChild1-1],
[nameParent1, nameChild1-2],
[nameParent1, nameChild1-3],
[nameParent1, nameChild1-4],
[nameParent2, nameChild2-1],
[nameParent3, nameChild3-1]]
所以对于这个摘录,它将是
[[org.antlr antlr4, org.antlr antlr4-runtime],
[org.antlr antlr4, org.antlr antlr-runtime],
[org.antlr antlr4, org.antlr ST4],
[org.antlr antlr4, org.abego.treelayout org.abego.treelayout.core],
[org.abego.treelayout org.abego.treelayout.core, org.hamcrest hamcrest-core],
[org.slf4j slf4j-log4j12, org.apache.commons commons-lang3]]
我不确定如何在跟踪关系的同时迭代它&它也足够通用来处理任何数量的 children 和 children 和 children(让我知道是否需要澄清)。
提前致谢!
**#FINAL CODE -> based off of Michael Bianconi's answer**
def getParentsChildren(mvn: tuple) -> list:
result = []
parent = mvn[1]['oid']
children = mvn[5]['children']
for child in children:
result.append([parent, child[1]['oid']])
if len(child) >= 2: **# MODIFIED LINE**
result.extend(getParentsChildren(child))
return result
def getAll(mvn: list) -> list:
result = []
for m in mvn:
result.extend(getParentsChildren(m))
return result **# MODIFIED LINE**
整个就是一个元组列表,所以循环遍历。元组中的第一项是父项,第二项是元组数组(从技术上讲,它是一堆相互嵌套的元组,但我认为这是一个错字,因为您永远不会关闭它们)。
def getParentsChildren(mvn: tuple) -> list:
result = []
parent = mvn[0]['name']
children = mvn[1]['children']
for child in children:
result.append([parent, child[0]['name'])
if child.length == 2: # has children
result.extend(getParentsChildren(child))
return result
def getAll(mvn: list) -> list:
result = []
for m in mvn:
result.extend(getParentsChildren(m))
我解析了一个 mvn 依赖树来创建一个存储信息的列表。我希望能够浏览此列表并在新列表中存储 parent + child 组合。解析后的 mvn 树的摘录如下(使用 pprint)& 我添加了带有 # 的注释以更明确地显示关系。
[({'name': '"org.antlr antlr4"'}, #parent1
{'children': [({'name': '"org.antlr antlr4-runtime"'}, #child1-1
({'name': '"org.antlr antlr-runtime"'}, #child1-2
({'name': '"org.antlr ST4"'}, #child1-3
({'name': '"org.abego.treelayout org.abego.treelayout.core"'}, child1-4 & parent2
{'children': [({'name': '"org.hamcrest hamcrest-core"'}, #child2-1
({'name': '"org.slf4j slf4j-log4j12"'}, #parent3
{'children': [({'name': '"org.apache.commons commons-lang3"'})] #child3-1
这是我的乱七八糟的尝试:
def relate(tree):
for name, subtree in tree.items():
group, artifact = name.split(":")
g = "groupId:" + group
a = "artifactId:" + artifact
c = {"children": "children"}
family = []
parent = name.group + name.artifact
if subtree:
for c in subtree:
child = name.group + name.artifact
family.append((parent, child))
return family
有没有一种方法可以遍历此列表和return一个新列表,其中return的信息如下所示?
[[nameParent1, nameChild1-1],
[nameParent1, nameChild1-2],
[nameParent1, nameChild1-3],
[nameParent1, nameChild1-4],
[nameParent2, nameChild2-1],
[nameParent3, nameChild3-1]]
所以对于这个摘录,它将是
[[org.antlr antlr4, org.antlr antlr4-runtime],
[org.antlr antlr4, org.antlr antlr-runtime],
[org.antlr antlr4, org.antlr ST4],
[org.antlr antlr4, org.abego.treelayout org.abego.treelayout.core],
[org.abego.treelayout org.abego.treelayout.core, org.hamcrest hamcrest-core],
[org.slf4j slf4j-log4j12, org.apache.commons commons-lang3]]
我不确定如何在跟踪关系的同时迭代它&它也足够通用来处理任何数量的 children 和 children 和 children(让我知道是否需要澄清)。 提前致谢!
**#FINAL CODE -> based off of Michael Bianconi's answer**
def getParentsChildren(mvn: tuple) -> list:
result = []
parent = mvn[1]['oid']
children = mvn[5]['children']
for child in children:
result.append([parent, child[1]['oid']])
if len(child) >= 2: **# MODIFIED LINE**
result.extend(getParentsChildren(child))
return result
def getAll(mvn: list) -> list:
result = []
for m in mvn:
result.extend(getParentsChildren(m))
return result **# MODIFIED LINE**
整个就是一个元组列表,所以循环遍历。元组中的第一项是父项,第二项是元组数组(从技术上讲,它是一堆相互嵌套的元组,但我认为这是一个错字,因为您永远不会关闭它们)。
def getParentsChildren(mvn: tuple) -> list:
result = []
parent = mvn[0]['name']
children = mvn[1]['children']
for child in children:
result.append([parent, child[0]['name'])
if child.length == 2: # has children
result.extend(getParentsChildren(child))
return result
def getAll(mvn: list) -> list:
result = []
for m in mvn:
result.extend(getParentsChildren(m))